使用push_back向vector添加对象工作正常,但使用访问器语法[]添加对象不工作
Adding object to vector with push_back working fine, but adding objects with accessor syntax [ ] , not working
我已经实现了向量的合并函数,它基本上在一个排序向量中组合成排序向量。(是的,这是一个归并排序算法)。我试图让我的代码更快,避免开销,所以我决定不在vector上使用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我已经为最终向量预留了空间,所以这应该不是问题。
您不能使用operator[]
向vector
添加新对象。.reserve()
也不添加它们。您必须使用.resize()
或.push_back()
。
同样,你根本没有避免开销;operator[]
的调用成本并不比push_back()
好多少,所以在彻底剖析代码之前,还是使用push_back
吧。您可以仍然使用reserve来确保不会进行不必要的分配。
vector[i] = item;
和
vector.push_back(item);
差异:
第一个修改索引
i
和i
处的元素必须是有效索引。也就是0 <= I <Vector.size()必须为true>
如果
i
是无效索引,则第一个索引调用未定义行为,这意味着任何事情都可能发生。但是,您可以使用at()
,如果i
无效,则会抛出异常:vector.at(i) = item; //throws exception if i is invalid
第二个在vector的末尾添加一个元素,这意味着vector的大小增加一个。
相关文章:
- 队列未添加对象-C++11
- 创建/向容器添加对象时如何使用构造函数/析构函数
- 向 std::map 添加对象和自定义比较<>
- 如何在构造函数的静态列表中添加对象
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 重载 + 运算符以使用 int 添加对象
- 如何在数组中添加对象成员
- 为什么类对象的向量在使用push_back添加对象时会删除对象
- 我如何阻止在多个向量中添加对象
- 指针集合和添加对象
- 动态添加对象
- 在c++中向向量添加对象vs向向量添加指针
- 添加c++对象到Objective C集合(NSSet)的麻烦
- 添加对象指针到链表c++
- c++ push_back只向vector中的位置0添加对象
- 在TStringList中添加对象
- 在c++中似乎不能正确地向数组中添加对象
- 使用push_back向vector添加对象工作正常,但使用访问器语法[]添加对象不工作
- 在for循环中向vector中添加对象
- 使用CMake从二进制文件编译并添加对象文件