使用 push_back 将对象添加到 vector 工作正常,但使用访问器语法 [ ] 添加对象,不起作用
Posted
技术标签:
【中文标题】使用 push_back 将对象添加到 vector 工作正常,但使用访问器语法 [ ] 添加对象,不起作用【英文标题】:Adding object to vector with push_back working fine, but adding objects with accessor syntax [ ] , not working 【发布时间】:2013-03-10 08:25:29 【问题描述】:我已经为向量实现了一个合并函数,它基本上结合到一个排序向量中的排序向量。 (是的,它用于合并排序算法)。我试图让我的代码更快并避免开销,所以我决定不在向量上使用 push_back 方法,而是尝试使用开销较小的数组语法。但是,有些事情发生了严重错误,当我这样做时输出混乱了。代码如下:
while(size1<left.size() && size2 < right.size()) //left and right are the input vectors
//it1 and it2 are iterators on the two sorted input vectors
if(*it1 <= *it2)
final.push_back(*it1); //final is the final vector to output
//final[count] = *it1; // this does not work for some reason
it1++;
size1++;
//cout<<"count ="<<count<<" size1 ="<<size1<<endl;
else
final.push_back(*it2);
//final[count] = left[size2];
it2++;
size2++;
count++;
//cout<<"count ="<<count<<" size1 ="<<size1<<"size2 = "<<size2<<endl;
在我看来,这两种方法在功能上应该是等效的。
PS 我已经为最终向量保留了空间,所以这应该不是问题。
【问题讨论】:
这里的断言可能是错误的,但我不明白反对票。为什么不解释 Bartek 的回答中的错误?这不符合 SO 的目的吗? 【参考方案1】:您不能使用operator[]
将新对象添加到vector
。 .reserve()
也不添加它们。您必须使用.resize()
或.push_back()
。
此外,您根本没有避免开销; operator[]
的调用成本并没有比 push_back()
好多少,所以在您彻底分析代码之前,请使用 push_back
。您可以仍然使用储备来确保不会进行不必要的分配。
在大多数情况下,像这样的“优化”并没有真正的帮助。如果您想让您的代码更快,请先对其进行分析并寻找热路径。
【讨论】:
谢谢!这真的很有帮助!【参考方案2】:两者差别很大
vector[i] = item;
和
vector.push_back(item);
区别:
第一个修改索引i
和i
处的元素必须是有效索引。也就是说,
0
如果i
是无效索引,则第一个索引会调用未定义的行为,这意味着任何事情都可能发生。但是,如果i
无效,您可以使用at()
引发异常:
vector.at(i) = item; //throws exception if i is invalid
第二个在最后向向量添加一个元素,这意味着向量的大小增加了一个。
李>既然,从语义上来说,他们俩都做不同的事情,那就选择你需要的那个吧。
【讨论】:
以上是关于使用 push_back 将对象添加到 vector 工作正常,但使用访问器语法 [ ] 添加对象,不起作用的主要内容,如果未能解决你的问题,请参考以下文章