我正试图想出一种方法将2个向量和一个整数合并为一个向量。即
return data.push_back(fn(data1), mid, fn(data2));
NB这是一个递归函数。向量数据在到达return语句之前具有存储在其中的值。我需要使用return语句中的值更新数据中的值。
我完全不知道如何去做这件事。我一直在寻找几个小时,但似乎什么都没有用!
非常感谢任何指导。
答案 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_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;
}
答案 2 :(得分:0)