如何连接/合并向量

时间:2012-10-09 18:28:33

标签: c++ vector

我正试图想出一种方法将2个向量和一个整数合并为一个向量。即

return data.push_back(fn(data1), mid, fn(data2));

NB这是一个递归函数。向量数据在到达return语句之前具有存储在其中的值。我需要使用return语句中的值更新数据中的值。

我完全不知道如何去做这件事。我一直在寻找几个小时,但似乎什么都没有用!

非常感谢任何指导。

3 个答案:

答案 0 :(得分:11)

std::vector::insert()接受迭代器范围:

std::vector<int> left(fn(data1));
std::vector<int> right(fn(data2));
data.insert(data.end(), left.begin(), left.end());
data.push_back(mid);
data.insert(data.end(), right.begin(), right.end());
return data;

您还可以使用<algorithm>中的std::copy()<iterator>中的std::back_inserter()

std::copy(left.begin(), left.end(), std::back_inserter(data));
data.push_back(mid);
std::copy(right.begin(), right.end(), std::back_inserter(data));

但是,insert()可提前知道其输入范围的大小,reserve()可获得适当的内存量,而back_insert_iterator则不透明 - 只需重复调用push_back() 。它们都以线性时间运行,但insert()可能会减少分配。

如果向量的元素移动比复制更有效,则可以使用<iterator>中的C ++ 11 std::make_move_iterator()来调整输入范围:

data.insert(data.end(),
    std::make_move_iterator(left.begin()),
    std::make_move_iterator(left.end()));
data.push_back(mid);
data.insert(data.end(),
    std::make_move_iterator(right.begin()),
    std::make_move_iterator(right.end()));

虽然我怀疑这会对int产生影响。

答案 1 :(得分:1)

std::back_inserterstd::copy一起使用。例如:

void foo(vector<int> lhs, vector<int>& rhs)
{
  vector<int> result;
  copy( lhs.begin(), lhs.end(), back_inserter(result));
  copy( rhs.begin(), rhs.end(), back_inserter(result));
  result push_back(42);
  return result;
}

答案 2 :(得分:0)

您想使用takes 3 iterator arguments

的插入成员函数