2016-10-06 4 views
0

는 다음과 같이 모델링 무언가의 컬렉션을 감안할 때 빈}. 표준 STL 컨테이너는 약속의 땅에 나를 점점되지 않습니다컨테이너 주문 요구 사항 (부스트 :: multi_index을 이해하기위한 노력의 일환으로)

select id, name from Foo group by name order by id 

:

어떻게 날에 해당 할 수 부스트 :: multi_index 같은 자료 구조를 사용합니까. 위의 SQL 변형을 사용하여 내 요점을 파악합니다. 나는 어떤 데이터베이스도 다루고 있지 않다.

UPDATE :

그래서, 분명히 내가 필요한 모든은 다음과 같습니다

typedef boost::multi_index_container< 
    Foo, 
    indexed_by< 
    ordered_unique<identity<Foo>>, 
    ordered_unique<member<Foo, std::string, &Foo::name>> 
    > 
> MIC; 

누군가 내가이 권리를 가지고 확인 할 수 있나요? 작동하는 것 같습니다. 나는 아직 그것을 테스트하지 않았다.

+0

[std :: map, 값순으로 정렬 한 다음 키별로 정렬하는 방법]의 가능한 복제본 (http://stackoverflow.com/questions/19842035/stdmap-how-to-sort-byvalue-then-by -key) – Treycos

+0

@Treycos 그것은 전혀 중복되지 않습니다. 제 SQL 쿼리를 다시 한번보세요. 나는 이드 (id), 그 다음 이름 (name) 순으로 물어 보지 않았다. 나는 ID별로 정렬하고 동시에 모든 * 동일한 * 이름을 그룹화하고 그 중 하나를 할당하려고한다고 말했습니다. 그래서 {1, "Foo"} {2, "Bar"} {3, "Foo"}는 결국 {1, "Foo"} {2, "Bar"} ** OR ** { } {3, "Foo"} – ForeverLearning

+0

SO mojo가 더 많은 사람이 "이 질문에 이미 답변이있을 수 있습니다"라는 태그를 제거 할 수 있습니까? 내 경우에는 부적절 해 보입니다. – ForeverLearning

답변

0

boost을 사용하는 측면에서 나는 그다지 사용하지 않지만,이 작업이 얼마나 효율적인지에 따라 필요하지 않다고 생각합니다.

표준 라이브러리 컨테이너가 Foo 인 경우 간편하게하기 위해 std::vector<Foo>라고 가정 해 보겠습니다.

std::string nameToSearchFor("Bar"); 
std::vector<Foo> vecFoos; 
std::vector<Foo> results; 
auto it = std::find_if(it, vecFoos.cend(), [&](const Foo& foo) { 
    return (foo.name == nameToSearchFor); 
}); 

while (it != vecFoos.cend()) 
{ 
    results.emplace_back(*it); 

    it = std::find_if(it, vecFoos.cend(), [&](const Foo& foo) { 
     return (foo.name == nameToSearchFor); 
    }); 
} 

std::sort(results.begin(), results.end(), [](const Foo& lhs, const Foo& rhs) { 
    return lhs.id < rhs.id; 
}); 

이 어떤 STL 컨테이너, 또는 그 요소에 적어도 ForwardIterator 액세스를 제공하는 모든 컨테이너와 함께 작동합니다 : 당신은 다음과 같은 일을 할 수 있습니다. 그러나 std::unordered_multimap과 같은 것을 사용하는 경우 내부 find/equal_range 방법을 활용하는 것이 좋습니다.

속도를 높이는 데는 여러 가지 방법이 있지만이 방법은 소규모 데이터 세트에서 원하는 것을 제공 할 수있는 순진하고 빠르고 이해하기 쉬운 방법입니다.

+0

고마워요! 나는 이것을 어렵게하는 방법을 안다. boost :: multi_index는이 목적을 위해 맞춤 제작 된 것으로 보이며 무료로이 자료를 얻는 방법을 알고 싶었습니다. 나는 총을 맞았다. 그리고 만일 당신이 나의 최신의 지위를 보으면, 그것은 일하는 것처럼 보인다. 나는 그것을 더 많은 입력으로 광범위하게 테스트하지 않았다. – ForeverLearning