我想创建两个迭代器
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
列表和多重集的行为相同...
这里
p1 = p2 = orderedNums.begin();
您使
p1
和 p2
等于 orderedNums.end()
,因为对于空容器 end == begin
。取消引用结束迭代器是未定义的。
std::multiset::insert
不会使迭代器无效,但这并不会改变 p1
和 p2
引用容器的 end
的事实。它们不会自动更新以引用新插入的元素。
您的代码具有未定义的行为。
不确定代码的实际目的是什么。如果您想将迭代器保留到插入的最后一个元素,您可以存储从
std::multiset::insert
返回的迭代器。