【发布时间】:2013-01-28 13:41:57
【问题描述】:
我在一个单独的数据结构中维护一组多集容器的迭代器。过了一会儿,我从这个数据结构中选择了一个迭代器,然后从多重集中删除了与该迭代器相关的元素。我先用这样的东西:
#include <iostream>
#include <set>
int main ()
{
std::multiset<int> myints;
std::cout << "0. size: " << myints.size() << '\n';
for (int i=0; i<10; i++) myints.insert(i);
std::cout << "1. size: " << myints.size() << '\n';
myints.insert (5);
std::cout << "2. size: " << myints.size() << '\n';
std::multiset<int>::iterator it = myints.find(5);
myints.erase (it);
std::cout << "3. size: " << myints.size() << '\n';
myints.erase (it);
std::cout << "4. size: " << myints.size() << '\n';
return 0;
}
然而,事实证明第二个myints.erase (it); 导致分段错误。因此,我更改为以下代码并且它可以工作。我想知道这是否是好方法或可行undefined 情况:
int main ()
{
std::multiset<int> myints;
std::cout << "0. size: " << myints.size() << '\n';
for (int i=0; i<10; i++) myints.insert(i);
std::cout << "1. size: " << myints.size() << '\n';
myints.insert (5);
std::cout << "2. size: " << myints.size() << '\n';
std::multiset<int>::iterator it = myints.find(5);
myints.erase (it);
std::cout << "3. size: " << myints.size() << '\n';
std::multiset<int>::iterator newit = myints.find(*it);
myints.erase (newit);
std::cout << "4. size: " << myints.size() << '\n';
return 0;
}
【问题讨论】:
-
这两种方法都有错误 - 你能更清楚地解释你真正想要做什么吗?
-
我使用多集容器构建了一个排序列表。因此,我需要在不知道它们的键的情况下从排序列表的中间删除一些元素。例如 1 2 3 4 的排序列表。过了一会儿,我需要在不知道其键的情况下从排序列表中删除一个元素(如中间元素)。因此,我维护了一组迭代器,指向单独数据结构中排序列表的每个元素,稍后,我将选择一个迭代器并从排序列表中删除相关元素。
-
是的,但是您需要删除哪些?移除元素的条件是什么?
-
如果你不知道key怎么删除元素?你怎么知道你要删除什么?
-
在任何插入或擦除操作之后,位于外部数据结构中的任何迭代器都可能失效。你不能那样做。
标签: c++ data-structures stl multiset