gpt4 book ai didi

c++ - vector 调整大小与嵌套 vector 的保留

转载 作者:行者123 更新时间:2023-11-30 02:56:57 24 4
gpt4 key购买 nike

我正在尝试使用另一个项目的代码,它们具有这种形式的结构:

struct data{
std::vector<sparse_array> cols,rows;
}

struct sparse_array {
std::vector<unsigned int> idxs;
std::vector<double> values;

void add(unsigned int idx, double value) {
idxs.push_back(idx);
values.push_back(value);
}
}

对于我的代码,我尝试使用以下几行:

data prob;
prob.cols.reserve(num_cols);
prob.rows.reserve(num_rows);

// Some loop that calls
prob.cols[i].add(idx, value);
prob.rows[i].add(idx, value);

当我将值 prob.rows[i].value[j] 输出到一个文件时,我得到的都是零。但是当我使用 resize 而不是 reserve 时,我得到了我读入的实际值。有人可以给我解释一下吗?

最佳答案

函数 reserve() 简单地分配一个足够大的连续内存区域来容纳您指定的项目数,并将 vector 的旧内容移动到这个新 block 中,这确保只要指定的容量在插入时就不会再对 vector 的存储进行重新分配不超过。此函数用于减少重新分配的次数(这也会使迭代器无效),但不会在 vector 的末尾插入任何新项

来自 C++11 标准,第 23.3.6.3/1 段关于 reserve() :

A directive that informs a vector of a planned change in size, so that it can manage the storage allocation accordingly. After reserve(), capacity() is greater or equal to the argument of reserve if reallocation happens; and equal to the previous value of capacity() otherwise. Reallocation happens at this point if and only if the current capacity is less than the argument of reserve(). If an exception is thrown other than by the move constructor of a non-CopyInsertable type, there are no effects.

注意通过做 prob.cols[i].push_back(idx, value);你可能会得到未定义的行为,因为i可能是越界索引。

另一方面,函数 resize() 确实在 vector 的末尾插入项目,以便 vector 的最终大小将是您指定的大小(这意味着它甚至可以删除元素,如果您指定尺寸小于当前尺寸)。如果您没有为调用 resize() 指定第二个参数,新插入的项目将被值初始化。否则,它们将根据您提供的值进行复制初始化。

来自 C++11 标准,第 23.3.6.3/9 段关于 resize() :

If sz <= size(), equivalent to erase(begin() + sz, end());. If size() < sz, appends sz - size() value-initialized elements to the sequence.

所以总结一下,为什么在调用 resize() 之后访问你的 vector 的原因给出的预期结果是项目实际上被添加到 vector 。另一方面,自从调用 reserve()不添加任何项目,后续访问不存在的元素将给你未定义的行为

关于c++ - vector 调整大小与嵌套 vector 的保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15047809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com