C++ 迭代器引用不存在值

问题描述 投票:0回答:1

我想创建两个迭代器

p1
p2
来继续指向多重集(或列表)中的某些元素,但奇怪的是
*p1 *p2
返回一个值,甚至不在多重集/列表中。在 for 循环遍历中,
*it
表现正常。

#include <iostream>
#include <set>

using namespace std;

class MedianFinder
{

private:
    multiset<int> orderedNums;
    int size;
    multiset<int>::iterator p1, p2;

public:
    MedianFinder() : size(0)
    {
        p1 = p2 = orderedNums.begin();
    }

    void addNum(int num)
    {
        orderedNums.insert(num);
        size++;

        cout << "p1: " << *p1 << " p2: " << *p2 << endl;

        cout << "ordered: ";
        for (multiset<int>::iterator it = orderedNums.begin(); it != orderedNums.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
};

int main()
{
    MedianFinder medianFinder;
    medianFinder.addNum(5); 
    medianFinder.addNum(7); 
    medianFinder.addNum(9); 
    return 0;
}

控制台输出:

p1: 1 p2: 1
ordered: 5 
p1: 2 p2: 2
ordered: 5 7 
p1: 3 p2: 3
ordered: 5 7 9

列表和多重集的行为相同...

c++ list iterator dereference multiset
1个回答
0
投票

这里

p1 = p2 = orderedNums.begin();

您使

p1
p2
等于
orderedNums.end()
,因为对于空容器
end == begin
。取消引用结束迭代器是未定义的。

std::multiset::insert
不会使迭代器无效,但这并不会改变
p1
p2
引用容器的
end
的事实。它们不会自动更新以引用新插入的元素。

您的代码具有未定义的行为。

不确定代码的实际目的是什么。如果您想将迭代器保留到插入的最后一个元素,您可以存储从

std::multiset::insert
返回的迭代器。

© www.soinside.com 2019 - 2024. All rights reserved.