使用 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);

区别:

第一个修改索引ii处的元素必须是有效索引。也就是说,

0

如果i 是无效索引,则第一个索引会调用未定义的行为,这意味着任何事情都可能发生。但是,如果i 无效,您可以使用at() 引发异常:

vector.at(i) = item; //throws exception if i is invalid

第二个在最后向向量添加一个元素,这意味着向量的大小增加了一个

李>

既然,从语义上来说,他们俩都做不同的事情,那就选择你需要的那个吧。

【讨论】:

以上是关于使用 push_back 将对象添加到 vector 工作正常,但使用访问器语法 [ ] 添加对象,不起作用的主要内容,如果未能解决你的问题,请参考以下文章

类对象不会 push_back 到向量上

C++ - 没有匹配的成员函数调用“push_back”

顺序容器的一些操作

CodeForces 577B 模和vecto

如何有效地将节点添加到段树中以进行最小范围查询?

将函数参数添加到向量