如何实现std::list在指定位置的局部反转?
实现std::list指定位置局部反转的方法
1 定位待反转区间的起始迭代器
std::list的迭代器属于双向迭代器,不支持随机访问的偏移运算符+,可以使用标准库提供的std::advance函数完成迭代器偏移,该函数定义在<iterator>头文件中。
以你的需求为例,要从第三个元素开始反转,只需要将首迭代器偏移2个位置即可:
// 定义待操作的list std::list<int> grades = {1,2,3,4,5,6}; // 初始化起始迭代器指向第一个元素 auto start = grades.begin(); // 迭代器向后偏移2个位置,指向第三个元素 std::advance(start, 2);
2 调用std::reverse完成局部反转
std::reverse支持传入任意双向迭代器区间完成反转,你只需要将刚才得到的起始迭代器和区间结束迭代器传入即可。你的需求是反转从第三个元素到列表末尾的所有元素,结束迭代器直接传grades.end()即可:
std::reverse(start, grades.end());
操作完成后grades的内容就会变成你期望的{1,2,6,5,4,3}。
扩展:反转任意中间区间
如果你需要反转的是列表的中间某一段,比如从第三个元素到第五个元素,只需要再定位到区间结束的迭代器即可:
auto start = grades.begin(); std::advance(start, 2); // 指向第三个元素,区间左闭 auto end = grades.begin(); std::advance(end, 5); // 指向第六个元素,区间右开,刚好覆盖第3-5个元素 std::reverse(start, end);
完整可运行示例代码
#include <iostream> #include <list> #include <algorithm> #include <iterator> int main() { std::list<int> grades = {1,2,3,4,5,6}; auto start = grades.begin(); std::advance(start, 2); std::reverse(start, grades.end()); // 输出验证结果 for (int num : grades) { std::cout << num << " "; } // 输出结果:1 2 6 5 4 3 return 0; }
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

