加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何迭代列表并从中删除?

发布时间:2020-12-16 05:06:39 所属栏目:百科 来源:网络整理
导读:我在使用List迭代器时遇到了很多麻烦,之前我问过一个问题但是无法得到我想要的解决方案. 我有一个循环列表,我必须用节点n替换节点n的值(步骤).然后我必须擦除节点n(步骤).当我擦除它时,将迭代器放在擦除元素之后的元素中.我需要在节点n处返回迭代器.我怎么能
我在使用List迭代器时遇到了很多麻烦,之前我问过一个问题但是无法得到我想要的解决方案.

我有一个循环列表,我必须用节点n替换节点n的值(步骤).然后我必须擦除节点n(步骤).当我擦除它时,将迭代器放在擦除元素之后的元素中.我需要在节点n处返回迭代器.我怎么能这样做因为每次我擦除n(步骤)我得到一个无效的迭代器.我的输入是5和2.

如果没有办法从列表中进行迭代和擦除,请告诉我是否有更好的数据结构.我想过使用Vector,但我必须将元素向下移动,如果有很多元素,那将会很昂贵.

#include "roulette.h"
#include <iostream>

uint roulette(uint people,uint step)
{
    std::list<uint>::iterator iterator;
    for(uint i = people; i > 0; i--)
        gl_myList.push_front(i);

    iterator = gl_myList.begin();
    while(people > 1)
    {
        iterator = advanceList(iterator,step - 1);
        uint replaceValue = *iterator; // Node n's value

        auto tempIterator = advanceList(iterator,step);
        uint newValue = *tempIterator; //Node n + step value

        iterator = gl_myList.erase(tempIterator);
        //Makes it past the erase function ONCE.

        //Puts the iterator back to the correct spot,and sets it value
        while(*iterator != replaceValue)
        {
            advanceList(iterator,1);

        }
        *iterator = newValue;

        people--;
    }

    return *iterator;
}

advanceList

#include "roulette.h"
std::list<uint>::iterator advanceList(std::list<uint>::iterator& start,uint step)
{
    for(uint i = 0; i < step; i++)
    {
        start++;
        if(start == gl_myList.end())
        {
            start = gl_myList.begin();
        }
    }

    return start;
}

解决方法

您没有正确使用erase()调用的结果,也没有在下一次迭代之前检查.end().我完全确定以下是你至少试图做的事情.请注意,这仍然是脆弱的,因为它是任何东西,但准备好边缘情况(如初始空列表,0步值等):
std::list<uint>::iterator advanceList(std::list<uint>::iterator& start,uint step)
{
    for(uint i = 0; i < step; i++)
    {
        if(++start == gl_myList.end())
            start = gl_myList.begin();
    }

    return start;
}

uint roulette(uint people,uint step)
{
    std::list<uint>::iterator it;
    for(uint i = people; i > 0; i--)
        gl_myList.push_front(i);

    it = gl_myList.begin();
    while (gl_myList.size() > 1)
    {
        it = gl_myList.erase(advanceList(it,step - 1));
        if (it == gl_myList.end())
            it = gl_myList.begin();
    }

    return *it;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读