如何将元素插入向量的开头?

91

我需要将值插入到 std::vector 的开头,并且需要将该向量中的其他值推到更远的位置,例如:向向量开头添加某些值,然后将从位置1移动到2的值,从2移动到3等。

我该怎么做?


12
请记住,将向量元素前置的操作是一个O(n)操作,因此如果您需要重复执行此操作,则可能希望使用更优化的数据结构(例如std::deque),或者使用其他技巧(例如,如果您只在向量前面添加和删除元素,则可以在向量末尾添加并以相反顺序显示)。 - Matteo Italia
5个回答

120

使用std::vector::insert函数,接受一个指向目标位置的迭代器作为目标位置(在其之前插入元素的迭代器):

#include <vector>

int main() {
    std::vector<int> v{ 1, 2, 3, 4, 5 };
    v.insert(v.begin(), 6);
}

或者,添加元素并向右执行旋转

#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v{ 1, 2, 3, 4, 5 };
    v.push_back(6);
    std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());
}

2
我不会把insert的第一个参数称为提示,我会说它更像是目标位置。 - Matteo Italia
3
使用 std::rotate 将其旋转到第一个位置。比插入和删除更清晰、更高效。 - Jerry Coffin
2
@JerryCoffin 为什么 push_backrotateinsert 更快? - Hope
1
@Hope:注意一下有关插入和删除的评论。如果我们只需要插入一个值,那么插入肯定是显而易见的选择。但至少在我的理解中,我们要删除一个值,并插入另一个值(在不同的位置,因此我们不能仅仅覆盖现有的值)。虽然他对某些细节有点含糊不清,但并不完全确定push_back/rotate会更快。另一方面,考虑到我们显然主要是在一个案例中向前添加,所以也值得考虑使用deque - Jerry Coffin
@JerryCoffin 好的,但如果我们使用向量,旋转更快的原因是它不像插入那样是O(n)操作,对吧? - Ac Hybl
显示剩余4条评论

36

您应该考虑使用std::deque。它的工作原理很像std::vector,但您可以从前面和后面添加和删除项目。

它通过将内部存储分成较小的块来实现这一点。您仍然具有良好查找速度的随机访问迭代器。

如果您的容器很小,那么使用std::vector方法就应该没有问题,但是如果您存储大量数据,则std::deque在插入/删除前端方面的性能将优于std::vector


这并没有回答问题,而是在假设作者不知道优化的情况下谈论优化。 - Ashutosh Tiwari
1
@AshutoshTiwari,它提供了与被接受答案不同的解决方案。这就是一个问题有多个答案的好处之一。它们相互补充。 - super
好的 @superman。 - Ashutosh Tiwari

0

这个怎么样?

#include <vector>
#include <algorithm>
#include <iterator>

int main()
{ 
    std::vector<int> v1 = { 1, 2, 3 };
    std::vector<int> v2 = { 4, 5, 6 };

    // merge
    std::vector<int> dst;
    std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst));
}

最终 dst 为:{1, 2, 3, 4, 5, 6}

注意:这只是一个示例,因此您应该检查 v1 是否为空等。


-1
你可以尝试这个。
    vector<int> v={1,2,3,4,5};
    for(int i=0;i<5;i++){
        v.insert(v.begin(),i+1);
    }

输出为{5,4,3,2,1,1,2,3,4,5}

每个元素在插入后都向右移动


-2

你可以从后面将值插入到 std::vector,然后使用std::reverse函数:

示例:

#include <vector>
#include <algorhitm>
#include <iostream>

void printVector( std::vector< int > const & _vector )
{
    for( auto value : _vector )
    {
         std::cout << value << " ";
    }

    std::cout << std::endl;
}

int main()
{
    std::vector< int > someVec;
    
    someVec.push_back( 5 );
    someVec.push_back( 4 );
    someVec.push_back( 3 );
    someVec.push_back( 2 );
    someVec.push_back( 1 );

    // (1)
    printVector( someVec );

    std::reverse( someVec.begin(), someVec.end() );
    
    // (2)
    printVector( someVec );

    return 0;
}

输出(1):

5 4 3 2 1 

输出(2):

1 2 3 4 5 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接