c++ - vector 的高效移动

标签 c++ c++11

保持长度不变并将空槽设置为 0 的 vector 线性移位的最佳方法是什么,就像 valarray.shift(int n) 所做的那样。

我能想到一个幼稚的方法,只是想知道是否有更好的方法

int shift = 2;
std::vector<int> v = {1,2,3,4,5};
std::rotate(v.begin(), v.end() - shift, v.end());
std::fill(v.begin(), v.begin() + shift, 0);

// Input: 1,2,3,4,5
// Output: 0,0,1,2,3

最佳答案

你可以使用 std::move相反,因为它可能比 std::rotate 更“高效”。不过仍然需要 std::fill 调用。

像这样使用

std::move(begin(v), end(v) - shift, begin(v) + shift);
std::fill(begin(v), begin(v) + shift, 0);

此外,如果 vector 的位移或大小是从程序外部输入的,那么不要忘记添加一些安全检查(如 the answer by Paolo 中)。

关于c++ - vector 的高效移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52288372/

相关文章:

c++ - 带有可变参数的 std::function 列表如何工作

c++ - 如何使用 inplace const char* 作为 std::string 内容

c++ - 是否有更适合键值数据结构的 QAbstractItemModel 类型类/接口(interface)?

c++ - 如何将宏用作其他宏参数列表之一

c++ - 可变参数模板参数包,仅接受无符号整数或size_t作为其类型

c++ - 为什么大括号初始化赋值会用垃圾填充变量?

c++ - 如何保证加载在存储发生之前完成?

c++ - 从二进制文件中读取 Int

c++ - 自动更改 C++11 中的含义;请删除它这是什么意思?

c++ - 函数指针声明在 C 中有效,但在 C++ 中无效