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

Posted

技术标签:

【中文标题】如何将元素插入向量的开头?【英文标题】:How can I insert element into beginning of vector? 【发布时间】:2018-01-14 15:42:23 【问题描述】:

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

我该怎么做?

【问题讨论】:

请记住,将内容推送到向量的前面是一个 O(n) 操作,因此如果您需要重复执行此操作,您可能希望使用更优化的数据结构(例如如std::deque),或使用其他技巧(例如,如果您只在前面添加和删除内容,只需在最后执行此操作并反向显示)。 【参考方案1】:

使用std::vector::insert 函数接受iterator to the first element 作为目标位置(在其之前插入元素的迭代器):

#include <vector>

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

或者,append 元素并在右侧执行rotation:

#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());

【讨论】:

我不会将insert 的第一个参数称为提示,我会说它更像是一个目标位置。 它正在工作,非常感谢。我还有一个问题。我制作了比较 2 个向量的循环,当值不匹配时,代码会将错误的值插入向量的开头。我现在如何从旧位置删除错误的值? @PawełSzymkowicz:使用std::rotate 将其置于首位。比插入和删除更干净、更高效。 @JerryCoffin 为什么push_back&rotateinsert 快? @Hope:注意关于插入和删除的注释。如果我们只需要插入一个值,那么 yes insert 将是显而易见的选择。但至少当我读到它时,我们正在删除一个,并插入另一个(在不同的地方,所以我们不能只覆盖现有值)。不是 100% 肯定 push_back/rotate 会更快——他对一些细节有点模糊。 OTOH,鉴于我们显然主要在一种情况下添加到前面,可能也值得考虑使用deque【参考方案2】:

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

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

如果您的容器很小,使用std::vector 方法应该没问题,但如果您存储大量数据,则std::deques 在前面插入/删除的性能会好得多。

【讨论】:

这并没有回答问题,而是假设作者不知道优化。 @AshutoshTiwari 它提供了与公认答案不同的解决方案。这是对一个问题有多个答案的好处之一。它们相辅相成。 好的@superman。【参考方案3】:

这个怎么样?

#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 是否为空等。

【讨论】:

【参考方案4】:

你可以试试这个

    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

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

【讨论】:

【参考方案5】:

您可以从后面向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 

【讨论】:

以上是关于如何将元素插入向量的开头?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用二分搜索将元素插入已排序的向量中

无法将元素插入到列表的向量中

如何在向量数组中插入元素?

C ++将元素插入向量

将元素插入已排序的向量中

将元素随机插入向量时随机减速