You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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

火山引擎 最新活动