2014-09-11 3 views

답변

3

사용 std::next는 반복자에게 k 위치

std::multiset 반복자는 BidirectionalIterators 때문에
res.erase(std::next(res.begin(), k), res.end()); 

코드를 컴파일에 실패하는 이유는를 진행하기 위해, 그래서 그들은 단지 당신이 할 필요가 있으므로, 사전/사후 증가/감소 연산자를 구현 반복자가 원하는 위치 수를 걸어, std::next 당신을 위해 할 것입니다.

+0

'std :: next'에 대해 몰랐습니다! 감사합니다. – gsamaras

+1

@ 0x499602D2 ['std :: advance'] (http://en.cppreference.com/w/cpp/iterator/advance). 그것은 짜증나는 점은 iterator에 대한 참조를 앞당기 기 때문에'begin()'iterator로 변수를 초기화하고'advance'로 전달해야한다는 것입니다. 위의 것과 같은 예쁜 라이너는 없습니다. – Praetorian

0

이터레이터 operator+은 비 랜덤 액세스 이터레이터를 추가하면 선형 연산이기 때문에 임의 액세스 이터레이터에서 작동해야합니다. multiset에 사용되는 이터레이터는 양방향이므로 직접 추가 할 수 없습니다.

@Praetorian은 정확하게 질문에 답변했지만, 나는 잘못된 질문을 풀거나 잘못된 질문을하고 있다고 주장 할 것입니다.

컨테이너에서 색인 생성을 사용하려면 vector을 사용하는 것이 좋습니다 (수시로 정렬 될 수 있음). 또는 지우려는 항목의 키를 알고있을 수도 있습니다. 그런 다음 대수 시간 find을 사용하여 이터레이터를 찾고 그 곳에서부터 지울 수 있습니다.

정렬되고 색인 가능하며 주문 된 컨테이너가 실제로 필요한 경우 표준 컨테이너 대신 boost::multi_index을 제안합니다.

+0

글쎄, 나는 벡터가 제공하지 않는 주문을 원한다. 또한 색인 생성이 필요한 유일한 부분 인 삭제를 피하는 방법을 생각했습니다. – gsamaras