프로그래밍 과제를 하다보니 stl리스트를 사용하게 되었는데,
노드 요소를 구조체로 사용하였을 때 아래와 같은 여러가지 난처한 상황에 처하게 되더군요.
MSDN에는 int를 사용한 예제만이 나와있기때문에 처음 stl list를 사용하시는 분들은
오랜시간동안 삽질을 하실것으로 예상되어 이렇게 팁을 적습니다.
1. 노드의 요소를 구조체 pointer로 사용할 경우
- sort()함수가 작동하지 않습니다.
2. 노드의 요소를 구조체 value로 사용할 경우
- remove(), erase()함수등이 작동하지 않습니다.
[해결책]
1. 노드의 요소를 구조체 pointer로 사용할 경우
오퍼레이터를 정의한 후, 함수를 실행시켜도 정렬이 되지 않습니다.
아직 해결방법을 찾지 못하였습니다. 조교님또한 value로 사용할 것을 권장하더군요.
2. 노드의 요소를 구조체 value로 사용할 경우
- remove(), erase()는 구조체 내에 bool타입의 operator==을 정의해 주어야합니다.
- sort()함수는 bool타입의 operator<를 정의해주어야합니다.
- sort()함수는 Compare함수를 파라메터로 넣을 수 있는데,
이건 네이버 검색해보면 쉽게 찾아보실 수 있습니다.
[예제]
#include <list>
#include <algorithm> // operator를 사용할 경우 꼭 필요합니다.
#include <iostream>
using namespace std;
typedef struct __test TEST, *PTEST;
struct __test
{
public:
__test(int va) : a(va) {}
int a;
bool operator<(const TEST& other)
{
return ( a < other.a);
};
bool operator==(const TEST& other)
{
return ( a == other.a);
};
};
int main(int argc, char* argv[])
{
TEST tmp = NULL;
list<TEST> l;
list<TEST>::iterator i;
TEST t1(3);
TEST t2(1);
TEST t3(4);
l.push_back(t1);
l.push_back(t2);
l.push_back(t3);
for(i = l.begin(); i != l.end(); i++)
{
tmp = *i;
cout << tmp.a << endl;
}
l.sort();
cout << endl;
for(i = l.begin(); i != l.end(); i++)
{
tmp = *i;
cout << tmp.a << endl;
}
l.remove(i);
return 0;
}
'IT_Programming > C · C++' 카테고리의 다른 글
offsetof() : 중첩된! 클래스에서 중첩한! 클래스의 포인터 얻기. (0) | 2008.01.10 |
---|---|
[C++/CLI] C++: .NET 프레임워크 프로그래밍을 위한 가장 강력한 언어 (0) | 2008.01.10 |
CRC 구현 (0) | 2007.11.26 |
CRC(Cyclic Redundancy Check) 검사 구현 (0) | 2007.11.26 |
[코드보기] strtok (0) | 2007.11.26 |