Sim*_*eon 5 replace vector stdvector c++11
我想知道用另一个较小的std :: vector替换(覆盖)给定std :: vector"input"的一部分的正确方法是什么?我确实保持原始矢量的其余部分保持不变.此外,我不需要打扰原始矢量中的内容,之后我不再需要保留较小的矢量.
说我有这个:
std::vector<int> input = { 0, 0, 1, 1, 2, 22, 3, 33, 99 };
std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 4, 5, 6, 7, 8 };
Run Code Online (Sandbox Code Playgroud)
我希望实现这一目标:
input = { 1, 2, 3, 4, 5, 6, 7, 8, 99}
Run Code Online (Sandbox Code Playgroud)
做正确的方法是什么?我想到了类似的东西
input.replace(input.beginn(), input.beginn()+a.size(), a);
Run Code Online (Sandbox Code Playgroud)
//中间输入看起来像这样:input = {1,2,3,1,2,22,3,33,99};
input.replace(input.beginn()+a.size(), input.beginn()+a.size()+b.size(), b);
Run Code Online (Sandbox Code Playgroud)
必须有一个标准的方法来做到这一点,不是吗?到目前为止,我对此的看法如下:
std :: vector :: push_back不会替换但是放大输入 - >不是我想要的
std :: vector :: insert也创建新元素并输入输入向量,但我确定向量a.size()+ b.size()<= input.size()
此外,如果解决方案不会因不必要的清除或将值写回向量a或b而浪费性能,我更愿意.我的向量对于真实来说非常大,这最终是关于性能的.
任何有能力的帮助将非常感激.
你似乎在追求std::copy().这就是你在你的例子中使用它的方法(在Coliru上的现场演示):
#include <algorithm> // Necessary for `std::copy`...
// ...
std::vector<int> input = { 0, 0, 1, 1, 2, 22, 3, 33, 99 };
std::vector<int> a = { 1, 2, 3 };
std::vector<int> b = { 4, 5, 6, 7, 8 };
std::copy(std::begin(a), std::end(a), std::begin(input));
std::copy(std::begin(b), std::end(b), std::begin(input) + a.size());
Run Code Online (Sandbox Code Playgroud)
正如Zyx2000 在注释中所述,在这种情况下,您还可以使用第一次调用返回的迭代器std::copy()作为下一个副本的插入点:
auto last = std::copy(std::begin(a), std::end(a), std::begin(input));
std::copy(std::begin(b), std::end(b), last);
Run Code Online (Sandbox Code Playgroud)
这样,不再需要随机访问迭代器 - 就像我们使用表达式时那样std::begin(input) + a.size().
前两个参数std::copy()表示要复制的元素的源范围.第三个参数是要在目标容器中覆盖的第一个元素的迭代器.
使用时std::copy(),请确保目标容器足够大,以容纳您要复制的元素数量.
此外,源和目标范围不应交错.
| 归档时间: |
|
| 查看次数: |
2094 次 |
| 最近记录: |