2013-07-08 4 views
0

반복하는, 나는 그런사용 참조, 내가 쓰고 있어요 응용 프로그램에서 그들을

std::vector<my_struct> db; 
등의 개체 내 데이터를 저장

종종 내가 그들의 요소 중 일부를 참조하고, 표준 : 설정 나는 (변경되지 않습니다하는) 벡터에 자신의 위치를 ​​저장하는 그런

std::set<int> elements_i_like; 

를 사용해야합니다, 나는

와 DB 요소에 액세스
for (auto it = elements_i_like.begin(); it!=elements_i_like.end(); it++){ 
    db[*it].do_something(); 
} 

나는 벡터에있는 요소의 인덱스를 저장하지 않고 성능면에서 더 나은 점은 의심 스럽지만 직접적으로 참조 할 수 있습니까?

std::vector<my_struct> db; //where i store the data (edit form original question) 
std::set<my_struct&> elements_i_like;//reference to the specific structs, stored in the vector, that i want to iterate on 

for(auto it= elements_i_like.begin(); it!=elements_i_like.end(); it++){ 
    (*it).do_something(); 
} 

을 그리고 이렇게 어떤 단점이 될 수 있을까? 감사합니다. .

+0

한 가지 단점은 ... 컨테이너에 –

+1

를 참조를 저장할 수 없습니다하지만 당신은 * 할 수 있다는 것입니다 * 저장소'std :: reference_wrapper's. – chris

+0

내 생각에 벡터는 이전 C++ 11 코드의 성능 측면에서 "배고파"입니다. 벡터는 메모리에서 연속적으로 부여되는 데이터 덩어리입니다 (일반 오래된 배열처럼). 전체 벡터를 재배치해야하는 요소를 벡터에 추가하십시오. 벡터가 커지면 높을수록 메모리 연산 측면에서 좋은 비용을 지불하게됩니다. 모두는 당신이 "성과"에 의미하는 것에 달려 있습니다. – user2485710

답변

0

컨테이너에 참조를 저장할 수 없으며 컴파일러/언어에서 허용되는 경우에도 각 반복을 평가하기 위해서는 두 개의 참조 해제가 필요합니다. 그런데

, C++ (11)를 사용할 수있는 경우, 당신은뿐만 루프를 다시 작성할 수 :

for(auto& elem : elements_i_like) 
    elem.do_something(); 
+0

감사합니다. 이것은 훌륭한 해결책 인 것 같습니다. 나는 궁금하다. 어떻게 엘리먼트를 선언해야 하는가? – darius

+0

좋아요, 이걸 루프 용 범위에서 어떻게 사용하는지 알아 냈습니다. 결국 jogojapan가 말한 것 때문에 int가 내 원래의 질문에 가장 좋은 선택이 될 것이라고 생각합니다. – darius

관련 문제