如何将vector<vector<int>>的最后一个元素移至开头?已尝试std::rotate、std::move未果
解决vector<vector>末尾元素移至开头的问题
嘿,你遇到的问题其实很容易搞定!std::rotate完全支持嵌套的vector类型,只是可能你之前的用法没找对;而std::move本身只是用来转移对象所有权,单独用它当然没法完成元素位置的调整啦。下面给你两种靠谱的实现方式:
方法一:正确使用std::rotate
std::rotate的核心是操作迭代器,和元素的具体类型无关——不管是int还是vector<int>,只要迭代器符合要求(vector的迭代器是随机访问迭代器,完全满足)就能用。
你只需要把旋转的起始点设为最后一个元素的迭代器,代码示例如下:
#include <vector> #include <algorithm> int main() { std::vector<std::vector<int>> my_vec = {{1,2}, {3,4}, {5,6}}; // 一定要先判断容器非空,避免越界访问 if (!my_vec.empty()) { // 参数分别是:范围起始、旋转分割点、范围结束 std::rotate(my_vec.begin(), my_vec.end() - 1, my_vec.end()); } // 此时my_vec的内容为 {{5,6}, {1,2}, {3,4}} return 0; }
这个方法的优势是效率高,时间复杂度为O(n),而且代码简洁。
方法二:手动结合std::move完成移动
如果你更倾向于手动控制整个过程,可以先把最后一个元素通过std::move转移出来,再删除原位置的元素,最后插入到容器开头:
#include <vector> int main() { std::vector<std::vector<int>> my_vec = {{1,2}, {3,4}, {5,6}}; if (!my_vec.empty()) { // 用std::move转移最后一个元素的所有权,避免深拷贝 auto last_element = std::move(my_vec.back()); my_vec.pop_back(); // 再次用std::move把元素插入开头,同样避免拷贝 my_vec.insert(my_vec.begin(), std::move(last_element)); } // 结果和上面的方法一致 return 0; }
这种方式的好处是逻辑直观,每一步都清晰可控,而且std::move的使用能保证没有不必要的内存拷贝,性能也很不错。
小提醒
不管用哪种方法,一定要先判断容器是否为空!如果容器是空的,访问my_vec.end()-1或者my_vec.back()都会触发未定义行为,导致程序崩溃或者奇怪的错误。
内容的提问来源于stack exchange,提问作者Pawel J




