连接两个std :: vector

如何连接两个<code>std::vector ?


#1楼

我会使用insert函数 ,类似:

vector<int> a, b;
//fill with data
b.insert(b.end(), a.begin(), a.end());

#2楼

vector1.insert( vector1.end(), vector2.begin(), vector2.end() );

#3楼

std::vector<int> first;
std::vector<int> second;

first.insert(first.end(), second.begin(), second.end());

#4楼

或者您可以使用:

std::copy(source.begin(), source.end(), std::back_inserter(destination));

如果两个向量不包含完全相同的事物类型,则此模式很有用,因为您可以使用某些东西代替std :: back_inserter来将一种类型转换为另一种类型。


#5楼

如果您使用的是C ++ 11,并且希望移动元素而不是仅复制它们,则可以将std::move_iterator与insert(或copy)一起使用:

#include <vector>
#include <iostream>
#include <iterator>

int main(int argc, char** argv) {
  std::vector<int> dest{1,2,3,4,5};
  std::vector<int> src{6,7,8,9,10};

  // Move elements from src to dest.
  // src is left in undefined but safe-to-destruct state.
  dest.insert(
      dest.end(),
      std::make_move_iterator(src.begin()),
      std::make_move_iterator(src.end())
    );

  // Print out concatenated vector.
  std::copy(
      dest.begin(),
      dest.end(),
      std::ostream_iterator<int>(std::cout, "\n")
    );

  return 0;
}

对于具有int的示例,这将不会更加高效,因为移动它们并不比复制它们更有效,但是对于具有优化移动的数据结构,它可以避免复制不必要的状态:

#include <vector>
#include <iostream>
#include <iterator>

int main(int argc, char** argv) {
  std::vector<std::vector<int>> dest{
  {1,2,3,4,5}, {3,4}};
  std::vector<std::vector<int>> src{
  {6,7,8,9,10}};

  // Move elements from src to dest.
  // src is left in undefined but safe-to-destruct state.
  dest.insert(
      dest.end(),
      std::make_move_iterator(src.begin()),
      std::make_move_iterator(src.end())
    );

  return 0;
}

移动之后,src的元素处于未定义但可以安全销毁的状态,并且其先前的元素最后直接转移到dest的新元素。


#6楼

如果您对强大的异常保证感兴趣(当复制构造函数可以引发异常时):

template<typename T>
inline void append_copy(std::vector<T>& v1, const std::vector<T>& v2)
{
    const auto orig_v1_size = v1.size();
    v1.reserve(orig_v1_size + v2.size());
    try
    {
        v1.insert(v1.end(), v2.begin(), v2.end());
    }
    catch(...)
    {
        v1.erase(v1.begin() + orig_v1_size, v1.end());
        throw;
    }
}

如果向量元素的move构造函数可以抛出(不太可能,但仍然可以),则通常无法实现具有强烈保证的类似append_move


#7楼

对于C ++ 11,我更喜欢以下将向量b附加到a:

std::move(b.begin(), b.end(), std::bac
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值