使用push_back向vector添加对象工作正常,但使用访问器语法[]添加对象不工作

Adding object to vector with push_back working fine, but adding objects with accessor syntax [ ] , not working

本文关键字:添加 对象 工作 访问 语法 back push vector 使用      更新时间:2023-10-16

我已经实现了向量的合并函数,它基本上在一个排序向量中组合成排序向量。(是的,这是一个归并排序算法)。我试图让我的代码更快,避免开销,所以我决定不在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);

差异:

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

    0 <= I <Vector.size()必须为true>

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

    vector.at(i) = item; //throws exception if i is invalid
    
  • 第二个在vector的末尾添加一个元素,这意味着vector的大小增加一个

因为它们在语义上做不同的事情,选择你需要的那个