STL의 erase에 관한 질문...
글쓴이: firehole / 작성시간: 수, 2004/02/11 - 11:04오전
안녕하세요?
저는 구조체를 가르키는 vector변수를 선언하여 쓰레드 함수부분에
해당 조건에 맞는 구조체의 멤버를 찾아 해당 노드를 삭제하려 합니다.
STL책을 찾아보니,
두가지 방법이 있더군요...
제가 잠깐 적어보면,,
1) std::vector<Elem> coll;
......
//val을 값으로 가지는 모든 원소 제거
coll.erase(remove(coll.begin(0, coll.end(), val), coll.end());
2) 특정한 값을 가지는 첫 번재 원소만 제거할 경우
std::vector<Elem> coll;
.....
//val을 값으로 가지는 첫 번째 원소를 삭제한다.
std::vector<Elem>::iterator pos;
pos = find(coll.begin(), coll.end(), val);
if( pos != coll.end()) {
coll.erase(pos);
}
이 2가지 방법이 있더군요.
그런데...저는 위에서 말했듯이 구조체의 한 멤버, 즉 위 val에 해당하는 부분말입니다.
위 val을 어떻게 표현해야 하나요.. 제가 STL은 써보지 않아서 잘 몰라서 이렇게 질문을 올립니다.
참고로 해당 소스 부분을 기재할테니 자세한 답변 부탁드립니다.
수고하십시요.
struct NODEInfo{ char IP[16]; int thr_id[MAXSIZE]; //쓰레드 id배열 unsigned long LastAccessTime; //최종 접속 시간 bool udp_status; //접속할시 확인 하는 변수 }; vector <NODEInfo> node; //전역 vector 변수 void *thread_func(void *nCheck) //argument는 쓰레드 인덱스 값 { sleep(1); std::vector<NODEInfo>::iterator pos; int i = *((int *)nCheck); (1) node.erase(remove(node.begin(), node.end(), val); (2) pos = find(node.begin(), node.end(), val); if( pos != node.end()) { node.erase(pos); } .......................................... } 위 코드에서 (1), (2)번 경우를 다 적어놓았습니다. 정확히 여기서 val에 해당하는 부분이 "node.udp_status = false"이란 조건입니다. comfile을 해보니 error로는 ------------------------------------------ `class std::vector<NODEInfo, std::allocator<NODEInfo> >' has no member named `udp_status' ------------------------------------------[/code]
Forums:
find 알고리즘은 == 연산자를 이용해서 값을 찾습니다.원하시는
find 알고리즘은 == 연산자를 이용해서 값을 찾습니다.
원하시는 것은 아래와 같은 비교 연산자입니다.
bool operator ==(const Elem& left, const Elem& right)
{
// 알아서...
}
http://redwiki.net/wiki/moin.cgi/STL_20l
http://redwiki.net/wiki/moin.cgi/STL_20list_20_b0_a3_b4_dc_20_bb_e7_bf_eb_b9_fd#head-1ad4896e6e9444a805b6b24694598d93a6f0b17c
리스트에 관한 얘기지만 벡터도 크게 다르진 않을겁니다.
이렇게 고치면 되지 않을지..
(안 돌려봐서 장담은 못합니다. ;; )
----
자신을 이길 수 있는자는
무슨짓이든 할수있다..
즉..무서운 넘이란 말이지 ^-_-^
나? 아직 멀었지 ㅠㅠ
음 주제와 좀 벗어난 얘기입니다만...스레드와 같이 쓰시는 것 같
음 주제와 좀 벗어난 얘기입니다만...
스레드와 같이 쓰시는 것 같군요...
쓰시는 STL이 스레드에 안전한지 점검을 해보시는 것이 좋을 듯 합니다.
답변 잘 보았습니다.고맙습니다....참고로, kall님이 남겨
답변 잘 보았습니다.
고맙습니다....
참고로, kall님이 남겨주신 코드 잘 돌아갑니다..
댓글 달기