4

我试图找出一种将 2 个向量和一个整数合并为一个向量的方法。IE

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

注意这是一个递归函数。矢量数据在到达返回语句之前已存储在其中的值。我需要使用 return 语句中的值更新 data 中的值。

我完全不知道该怎么做。我一直在寻找几个小时,但似乎没有任何工作!

非常感谢任何指导。

4

3 回答 3

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;

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

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()可能会进行更少的分配。

如果向量的元素移动比复制更有效,则可以使用 C++11 std::make_move_iterator()from<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.

于 2012-10-09T18:32:19.140 回答
1

std::back_inserter与 一起使用std::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;
}
于 2012-10-09T18:33:46.203 回答
0

您想使用带有 3 个迭代器参数的插入成员函数。

于 2012-10-09T18:32:02.903 回答