請考慮以下程序。它創建一組指針到ints,並使用自定義的indrect_less比較器,通過指向整數的值對集合進行排序。一旦完成,我然後改變其中一個指向整數的值。然後,可以看到集合的順序不再被排序(我想因爲集合不知道有什麼改變)。通過間接使指針無效
(不介意的C++ 0x循環,我在VS2010運行)
#include <iostream>
#include <set>
using namespace std;
struct indirect_less {
bool operator()(int* l, int* r) const
{
return *l < *r;
}
};
int main()
{
set<int*, indirect_less> myset;
int* a = new int(5);
int* b = new int(6);
int* c = new int(7);
myset.insert(a);
myset.insert(b);
myset.insert(c);
cout << "Set contains: ";
// (outputs: 5 6 7)
for (auto i = myset.begin(), end = myset.end(); i != end; ++i)
{
cout << **i << " ";
}
cout << endl << "Modifying *a" << endl;
*a = 9; // point of interest
cout << "Set contains: ";
// (outputs: 9 6 7 - unsorted order)
for (auto i = myset.begin(), end = myset.end(); i != end; ++i)
{
cout << **i << " ";
}
cout << endl;
cin.get();
return 0;
}
1)我說得對,我調用未定義的行爲? myset
整行狀態是否爲*a = 9;
後無效?
2)是否唯一正確的方法來擦除然後重新插入a
?
3)有沒有辦法,一旦*a = 9;
已經運行,重新平衡集合到排序順序,具有明確定義的行爲?
我會去是的,是的,No. – 2010-08-10 16:39:05
該行後面定義的行爲?例如,你可以可靠地遍歷集合(具有未定義的順序)嗎? – AshleysBrain 2010-08-10 16:47:27
未定義不會以這種方式工作。一旦您調用未定義的行爲,所有投注都將關閉。你的程序可能會做任何事情,包括似乎繼續工作。直到它沒有。通常在爲別人演示代碼時很重要。 – KeithB 2010-08-10 19:46:03