具有预定义大小的 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的主要内容,如果未能解决你的问题,请参考以下文章

多个 std::vectors 来解决缓存问题?

使用密集和稀疏矩阵

带有 std::vectors 的图形?

两个 std::vectors 之间的匹配元素

将多个 std::vectors 复制到 1 的更好方法? (多线程)

C++ STD 容器:std::vector - 有没有办法清除向量并保留存储分配?