相关疑难解决方法(0)

std :: list :: clear会使std :: list :: end iterator失效吗?

检查此代码:

#include "stdafx.h"
#include <list>

int _tmain(int argc, _TCHAR* argv[])
{
    std::list<int> mylist;
    mylist.push_back(1);
    std::list<int>::iterator i = mylist.end();
    if( i == mylist.end() )
        printf( "end is end\n" );

    mylist.clear();
    if( i == mylist.end() )
        printf( "never get here because Microsoft seems to "
                "think the iterator is no longer safe.\n" );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,根据cplusplus.com,这不应该是一个问题,在发布模式下,我认为这很好,并没有真正引起任何问题,但调试变得不可能,因为这只是保释而不让我继续.有什么指针吗?

c++ stl stdlist visual-studio-2012

11
推荐指数
1
解决办法
1586
查看次数

保持std :: list迭代器通过插入有效

注意:这不是我应该"使用list还是deque"的问题.这是一个关于迭代器在面对的有效性的问题insert().


这可能是一个简单的问题,我只是太密集了,看不到正确的方法来做到这一点.我正在实现(无论好坏)网络流量缓冲区作为a std::list<char> buf,并且我将当前的读取位置保持为迭代器readpos.

当我添加数据时,我会做类似的事情

buf.insert(buf.end(), newdata.begin(), newdata.end());
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,如何保持readpos迭代器有效?如果它指向旧的中间buf,那么它应该没问题(通过std :: list的迭代器保证),但通常我可能已经读取并处理了所有数据而且我有readpos == buf.end().在插入之后,我readpos 总是希望指向下一个未读的字符,在插入的情况下应该是第一个插入的字符.

有什么建议?(没有将缓冲区更改为a std::deque<char>,这似乎更适合任务,如下所示.)

更新:从使用GCC4.4的快速测试中我发现deque和list的行为方式不同readpos = buf.end():插入结束后,readpos在列表中被破坏,但指向deque中的下一个元素.这是标准保证吗?

(根据cplusplus,任何deque :: insert()都会使所有迭代器失效.这没有用.可能使用计数器比迭代器更好地跟踪双端队列中的位置?)

c++ iterator stdlist

6
推荐指数
2
解决办法
6057
查看次数

插入后使用set :: begin()迭代器

请考虑以下代码:

std::set<int> s;
auto it = s.begin();
s.insert(1);
s.insert(2);
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出(至少对我而言)是2.这里发生了什么事?什么it时候我取消引用它的状态?

我知道当我调用begin()一个空集时,我得到一个等价的迭代器end().我也知道调用inserta set不会使其迭代器失效.迭代器是否保持等效,end()即使我现在已经插入元素set,所以现在我得到未定义的行为?这是由标准定义的吗?

c++ containers iterator set

3
推荐指数
1
解决办法
342
查看次数

标签 统计

c++ ×3

iterator ×2

stdlist ×2

containers ×1

set ×1

stl ×1

visual-studio-2012 ×1