如何在循环中访问list前后元素

1. 复制整个list

Copying and incrementing/decrementing the copy is the only way it can be done.

You can write wrapper functions to hide it (and as mentioned in answers, C++11 has std::prev/std::next which do just that (and Boost defines similar functions). But they are wrappers around this "copy and increment" operation, so you don‘t have to worry that you‘re doing it "wrong".

2. 使用C++0x或者C++11中的 pre 和 next

In C++0x, this functionality is neatly wrapped up in the std::prev function, which your C++ Standard Library implementation may support. If not, it looks something like this:

template <typename BidiIt>
BidiIt prev(BidiIt x, typename std::iterator_traits<BidiIt>::difference_type n=1)
{
    std::advance(x, -n);
    return x;
}

For C++11, there are the two methods you are looking for called std::prev and std::next. You can find them in the iterator library.

Example from cppreference.com

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::list<int> v{ 3, 1, 4 };

    auto it = v.begin();

    auto nx = std::next(it, 2);

    std::cout << *it << ‘ ‘ << *nx << ‘\n‘;
}

Output:

3 4

3. 使用Boost中的 prior 和 next

A simple precanned solution are prior and next from Boost.utility. They take advantage of operator-- and operator++ but don‘t require you to create a temporary.

4. 创建新的iterator

std::list is only bidirecitonally iterable, so you can only move the iterator one position at a time. You thus need to create a new iterator:

iter_copy = iter;
--iter;

Obviously, you are responsible for ensuring that a previous element actually exists before you decrement the iterator.

Reference:

http://stackoverflow.com/questions/10137214/how-get-next-previous-element-in-stdlist-without-incrementing-decrementing

http://stackoverflow.com/questions/5586377/how-to-access-the-previous-element-in-a-c-list-iterator-loop

时间: 2024-09-30 06:48:04

如何在循环中访问list前后元素的相关文章

Java循环中删除一个列表元素

本文主要想讲述一下我对之前看到一篇文章的说法.假设跟你的想法有出入,欢迎留言.一起讨论. #3. 在循环中删除一个列表元素 考虑以下的代码.迭代过程中删除元素: ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (int i = 0; i < list.size(); i++

循环中安全删除集合元素

在循环中删除集合元素可能出现数组越界的问题,比如: List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); for (Integer item : list) { System.out.println(item); if (item == 1) { list.remove(item); } } 正确的做法是使用迭代器: List<Integer> list = new

javascript在数组的循环中删除元素

在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往不会像预想的那样顺利运行. 出现的问题场景还原 (function () { var arr = [1, 2, 2, 3, 4, 5]; for (var i = 0; i < arr.length; i++){ // 打印数组中的情况,便于跟踪数组中数据的变化 console.log(i + '

Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循环索引很简单,只需在循环中使用{{@index}}即可. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <META http-equiv=Content-Type content="text/html; charset=utf-

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响)

C#不允许在foreach循环中改变数组或集合中元素的值(注:成员的值不受影响),如以下代码将无法通过编译. foreach (int x in myArray) { x++; //错误代码,因为改变了元素的值 Console.WriteLine(x); } 如果要让自定义的数据类型支持foreach循环,则该类型必须实现IEnumerable<T>接口,且存在对应此列表的IEnumerator<T>实现. 实际上,在.Net的底层(IL语言层面)而言, foreach (var

Struts2中访问web元素的四种方式

Struts2中访问web元素的四种方式如下: 通过ActionContext来访问Map类型的request.session.application对象. 通过实现RequestAware.SessionAware.ApplicationAware接口来访问Map类型的request.session.application对象(IoC方式). 通过ServletActionContext来访问Servlet API类型的HttpServletRequest. HttpSession. Serv

每天一个JavaScript实例-从js脚本中访问object元素中的SVG

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-从js脚本中访问object元素中的SVG</title> <style> </style> </head> &l

Struts2中访问web元素

有很多时候我们都需要访问web元素,比如说用户管理系统,用户登录成功了需要往session中放置一个值,然后要在前台拿到这个值,常用的web元素包括request.session和application等. Struts2中有四种方式可以访问到web元素: 1.通过ActionContext来访问Map类型的request.session.application对象. 2.通过实现RequestAware.SessionAware.ApplicationAware接口来访问Map类型的reque

js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素

 壹 ? 引 在JS开发工作中,遍历数组的操作可谓十分常见了,那么像for循环,forEach此类方法自然也不会陌生,我个人也觉得forEach不值得写一篇博客记录,直到我遇到了一个有趣的问题,我们来看一段代码: let arr = [1, 2]; arr.forEach((item, index) => { arr.splice(index, 1); console.log(1); //输出几次? }); console.log(arr) //? 请问,这段代码执行完毕后arr输出为多少?循环