컨테이너에서 유일한 요소 만 얻으려고했습니다. srcContainer
이 고유 한 요소를 원하는 컨테이너라고 가정 해 보겠습니다. 나는 세 가지 옵션 바라 보았다 : 표준 :컨테이너에서 고유 한 요소 가져 오기 [C++]
std::sort(srcContainer.begin(), srcContainer.end());
srcContainer.erase(std::unique(srcContainer.begin(), srcContainer.end()), srcContainer.end());
독특한 사용 BOOST :: 독특한 사용
-
boost::erase(srcContainer, boost::unique<boost::return_found_end>(boost::sort(srcContainer)));
내 자신의 방법
std::set<T> uniqueElems(srcContainer.begin(), srcContainer.end()); srcContainer.clear(); srcContainer.insert(srcContainer.end(), uniqueElems.begin(), uniqueElems.end());
1. 및 2.의 문제는 원래 srcContainer에서 멤버가 발생한 순서를 변경한다는 것입니다. 3. 순서 변경이없고, 또한 1.과 2에 비해 성능이 훨씬 우수합니다 (위의 3에 명시 적 정렬이 없기 때문입니까?). (3 개) 상기 방법 및 srcContainer의 요소 수의 경과 벽시계 시간은 다음과 같음 : - 표준 : 고유 = 1.04779 초 srcContainer의
크기 = 1E + 6
(정수를 포함)
- BOOST :: 독특한 = 1.04774 초
이 - 자신의 방법 = 0.481638 초srcContainer의 크기 (INT를 포함 egers) = 1E + 8
- 표준 : 독특한 = 151.554 초
- 독특한 BOOST :: = 151.474 초
- 자신의 방법 = 57.5693 초
내 질문은 :
- std :: unique 또는 BOOST :: unique 또는 다른 코드를 사용하여 고유를 찾고 더 원래의 순서를 유지하는 더 좋은 방법이 있습니까? 컨테이너에?
- 위의 방법 3.을 사용하는 데 문제가 있습니다. 다음 성능 프로파일
srcContainer
들어
작성 하였다
std::vector<int> srcContainer;
int halfWay = numElems/2;
for (size_t k=0; k<numElems; ++k) {
if (k < halfWay)
srcContainer.push_back(k);
else
srcContainer.push_back(k - halfWay);
}
수정 사항 :
방법은도 3 요소의 순서를 변경하는 것이 코멘트 동의. 주문을 변경하지 않고 고유 한 요소를 얻는 더 좋은 방법이 있습니까? 소스 데이터에 대한 정보를 기반으로
감사
srcContainer의 유형은 무엇입니까? –
이 경우에는 srcContainer에 벡터를 사용하여 테스트했습니다. 하지만 BOOST :: unique처럼 대부분의 컨테이너 유형에서 코드가 작동하도록하고 싶습니다. – cppcoder
방금 컨테이너에 얼마나 큰 관심이 있습니까? 코드를 프로파일 링 했습니까? 병목 현상은 어디에 있습니까? 어떤 플랫폼을 사용하고 있습니까? 극단적 인 장기 실행 시간에서 볼 때, 병목 현상은 std :: unique에서 온 대형 컨테이너의 사본을 생성하는 것으로 생각됩니다. – tmaric