具有预定义大小的 C++ std::vectors

C++ std::vectors with predefined sizes

在查看问题的解决方案时,我遇到了矢量的实现。

const int MX = 100000;
std::vector <int> adj[MX];

push_back() 函数不适用于矢量 class 的实现,要添加一个元素,使用了以下代码:

std::ifstream fin ("file.in");
int N = 5;
for (int i = 0; i < (N-1); i++) {
    int A,B; fin >> A >> B;             // reading values from another file
    adj[A].pb(B), adj[B].pb(A);
}

此代码添加的方式是将值推回列表的特定部分,我将其想象为表单向量中的向量:

{
    { },
    { }
}

此外,我将如何遍历此向量,因为 for (int n : adj) 不起作用。我不确定这个向量是什么形式,因为这种循环方法不起作用。

你拥有的是 C 风格的向量数组,你可以立即将其替换为 std::array:

std::array<std::vector<int>, MX> adj;

要遍历这些,您必须使用嵌套循环,外层循环遍历数组,内层循环遍历每个向量,如下所示:

const int MX = 3;

//array of 3 vectors
std::array<std::vector<int>, MX> adj {{{1,2,3,4}, {5,6,7,8}, {9, 10, 11, 12}}};

for(auto &v : adj){    //for the array
    for(auto i : v){   //for each vector
        std::cout << i << " "; 
    } 
    std::cout << "\n";      
}

输出:

1 2 3 4
5 6 7 8
9 10 11 12

您还可以使用 C 样式索引访问单个元素:

std::cout << adj[1][0]; // vector element index 0 of array index 1

或者以更安全的方式,使用容器成员 at:

std::cout << adj.at(1).at(0);

这将输出 5.

不过你要小心,在随机填充数组时,数组不应该有空元素,否则循环会遍历未初始化的数组成员,这并不理想,也许你正在寻找一些 other kind of container.