0

我已经为向量实现了一个合并函数,它基本上结合到一个排序向量中的排序向量。(是的,它用于合并排序算法)。我试图让我的代码更快并避免开销,所以我决定不在向量上使用 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 我已经为最终向量保留了空间,所以这不应该是一个问题。

4

2 回答 2

4

不能将新对象添加到vectorusing 中operator[].reserve()也不添加它们。您必须使用.resize().push_back()

此外,您根本没有避免开销;调用成本operator[]并没有那么好push_back(),所以在你彻底分析你的代码之前,只需使用push_back. 您仍然可以使用储备来确保不会进行不必要的分配。

在大多数情况下,像这样的“优化”并没有真正的帮助。如果你想让你的代码更快,首先分析它并寻找热路径。

于 2013-03-10T08:26:48.250 回答
3

之间有很大的区别

vector[i] = item;

vector.push_back(item);

差异:

  • 第一个修改索引处的元素,i并且i必须是有效的索引。那是,

    0 <= i < vector.size() 必须为真

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

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

因为,从语义上来说,他们俩都做不同的事情,所以选择你需要的那个。

于 2013-03-10T08:28:29.870 回答