다음 프로그램을 고려하십시오. 이 함수는 int에 대한 포인터 집합을 만들고 지시 된 정수의 값으로 집합을 정렬하는 사용자 정의 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) 내가 정의되지 않은 동작을 호출하고 있습니까 그 권리? 라인 *a = 9;
이후에 myset
의 전체 상태가 유효하지 않습니까?
2) 이것을 수행하여 a
을 다시 삽입하는 올바른 방법이 있습니까?
3) 어떤 식 으로든, *a = 9;
이 실행되면, 잘 정의 된 동작으로 정렬 된 순서로 집합의 균형을 다시 잡으십시오?
예, 예, 아니오로갑니다. –
해당 행 다음에 어떤 동작이 정의되어 있습니까? 예를 들어, 정의되지 않은 순서로 세트를 반복해서 반복 할 수 있습니까? – AshleysBrain
정의되지 않은 방법으로 작동하지 않습니다. 정의되지 않은 동작을 호출하면 모든 베팅이 해제됩니다. 프로그램은 계속해서 작동하는 것을 포함하여 모든 작업을 수행 할 수 있습니다. 그럴 때까지. 일반적으로 중요한 코드를 데모 할 때 사용합니다. – KeithB