漂亮的 cpp
/*
* @Github: https://github.com/Certseeds/CS323_Compilers_2020F
* @Organization: SUSTech
* @Author: nanoseeds
* @Date: 2020-11-29 14:31:17
* @LastEditors: nanoseeds
* @LastEditTime: 2020-11-29 16:08:43
*/
#include <iostream>
#include <string>
#include <unordered_set>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
using input_f = vector<std::pair<int, int>>;
using output_f = unordered_set<string>;
static input_f input;
static int number;
static output_f output;
static output_f nextoutput;
auto input_func = [] {
int lines;
std::cin >> number >> lines;
input.resize(lines);
for (auto &i : input) { // 遍历 vector
std::cin >> i.first >> i.second;
i.first -= 1;
i.second -= 1;
}
return 0;
}(); // 立即执行
auto output_func = []() {
for (auto &i: output) {
string j(i); // 拷贝字符串
transform(j.begin(), j.end(), j.begin(), [](auto r) { return static_cast<char>(r + 1); });
std::cout << "[ ";
std::copy(j.begin(), j.end(), ostream_iterator<char>(cout, ", "));
std::cout << "\b\b ";
std::cout << "]," << std::endl;
}
};
void toposort(const input_f &input);
int main() {
toposort(input);
output_func();
return 0;
}
void toposort(const input_f &input) {
vector<int> in(number, 0);
for (const auto &i : input) {
in[i.second]++; // 计算入度
}
string begin = "";
output.insert(begin);
for (int order = 0; order < number; order++) {
for (const auto &i : output) {
//std::cout << i << std::endl;
vector<int> tempin(in);
for (const auto& j : i) {
auto num = j - '0';
for (const auto &k : input) {
if (k.first == num) {
tempin[k.second]--;
/* code */
}
}
}
for (const auto& j : i) {
tempin[j - '0'] = -1;
}
for (size_t j = 0; j < tempin.size(); j++) {
if (tempin[j] == 0) {
nextoutput.insert(string(i).append(string(1, j + '0')));
}
}
}
std::swap(output, nextoutput);
nextoutput.clear();
}
}
lambda 函数
[capture list] (parameters) -> return_type {
// 函数体
return ...;
};
匿名函数,当需要编写简短的,一次性的函数的时候可以使用
可能会适当进行优化比如说内联,来减少函数调用的开销
vector
std::vector
在 C++ 中是非常常用的容器,特别适用于需要动态管理数据集合大小的场景,如动态存储未知数量的元素或者动态调整存储需求的情况。
拓扑排序
实现 kahn 算法