具有预定义大小的 C++ std::vectors
Posted
技术标签:
【中文标题】具有预定义大小的 C++ std::vectors【英文标题】:C++ std::vectors with predefined sizes 【发布时间】:2021-03-08 15:29:47 【问题描述】:在查看问题的解决方案时,我遇到了向量的这种实现。
const int MX = 100000;
std::vector <int> adj[MX];
push_back()
函数不适用于此向量类的实现,为了添加元素,使用了以下代码:
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)
不起作用,我将如何遍历该向量。我不确定这个向量的形式是什么,因为这种循环方法不起作用。
【问题讨论】:
您没有包含 100000 个元素的向量。你有一个包含 100000 个向量的数组。 “push_back() 函数不起作用”。这意味着什么?你怎么知道的? “for (int n : adj) 不起作用” 什么意思?你怎么知道的? 不起作用这句话不能很好地描述您希望解决的问题。 @BillLynch 谢谢你的帮助! 【参考方案1】:您拥有的是 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。
【讨论】:
以上是关于具有预定义大小的 C++ std::vectors的主要内容,如果未能解决你的问题,请参考以下文章