i
은 k
입니다. 이후 사용자는 i
을 사용했습니다.std :: multiset의 i 번째 요소를 끝까지 삭제합니다.
std::multiset<std::pair<Point::FT, int> > res;
res.erase(res.begin() + k, res.end());
오류 : +
어떻게이 기능을 달성 할 수있는 연산자에 대한
전혀 일치?
i
은 k
입니다. 이후 사용자는 i
을 사용했습니다.std :: multiset의 i 번째 요소를 끝까지 삭제합니다.
std::multiset<std::pair<Point::FT, int> > res;
res.erase(res.begin() + k, res.end());
오류 : +
어떻게이 기능을 달성 할 수있는 연산자에 대한
전혀 일치?
사용 std::next
는 반복자에게 k
위치
std::multiset
반복자는
BidirectionalIterators 때문에
res.erase(std::next(res.begin(), k), res.end());
코드를 컴파일에 실패하는 이유는를 진행하기 위해, 그래서 그들은 단지 당신이 할 필요가 있으므로, 사전/사후 증가/감소 연산자를 구현 반복자가 원하는 위치 수를 걸어, std::next
당신을 위해 할 것입니다.
이터레이터 operator+
은 비 랜덤 액세스 이터레이터를 추가하면 선형 연산이기 때문에 임의 액세스 이터레이터에서 작동해야합니다. multiset
에 사용되는 이터레이터는 양방향이므로 직접 추가 할 수 없습니다.
@Praetorian은 정확하게 질문에 답변했지만, 나는 잘못된 질문을 풀거나 잘못된 질문을하고 있다고 주장 할 것입니다.
컨테이너에서 색인 생성을 사용하려면 vector
을 사용하는 것이 좋습니다 (수시로 정렬 될 수 있음). 또는 지우려는 항목의 키를 알고있을 수도 있습니다. 그런 다음 대수 시간 find
을 사용하여 이터레이터를 찾고 그 곳에서부터 지울 수 있습니다.
정렬되고 색인 가능하며 주문 된 컨테이너가 실제로 필요한 경우 표준 컨테이너 대신 boost::multi_index
을 제안합니다.
글쎄, 나는 벡터가 제공하지 않는 주문을 원한다. 또한 색인 생성이 필요한 유일한 부분 인 삭제를 피하는 방법을 생각했습니다. – gsamaras
'std :: next'에 대해 몰랐습니다! 감사합니다. – gsamaras
@ 0x499602D2 ['std :: advance'] (http://en.cppreference.com/w/cpp/iterator/advance). 그것은 짜증나는 점은 iterator에 대한 참조를 앞당기 기 때문에'begin()'iterator로 변수를 초기화하고'advance'로 전달해야한다는 것입니다. 위의 것과 같은 예쁜 라이너는 없습니다. – Praetorian