2011-04-20 3 views
63

목록이 있습니다.위치에 주어진리스트에서 특정 원소를 얻는 방법?

list<Object> myList; 
myList.push_back(Object myObject); 

확실치 않지만 배열의 "0 번째"요소가 될 것이라고 확신합니다. "myObject"를 반환 할 수있는 함수가 있습니까?

Object copy = myList.find_element(0); 

?

+6

- 그것은 목록입니다 :로 사용합니다. 정수로 인덱싱하려면 '벡터'를 대신 사용 하시겠습니까? –

+2

항상 요소 0을 원하면'front()'를 사용하십시오. –

+0

테스트하지는 않았지만 myList.front() + num이 여기에서 작동한다고 가정합니다. –

답변

91

시퀀스의 N 번째 요소에 자주 액세스해야하는 경우 이중 연결 목록으로 구현 된 std::list은 아마도 올바른 선택이 아닙니다. std::vector 또는 std::deque 일 가능성이 큽니다. 말했다

, 당신은 std::advance를 사용하여 N 번째 요소에 대한 반복자를 얻을 수 있습니다 :

std::list<Object> l; 
// add elements to list 'l'... 

unsigned N = /* index of the element you want to retrieve */; 
if (l.size() > N) 
{ 
    std::list<Object>::iterator it = l.begin(); 
    std::advance(it, N); 
    // 'it' points to the element at index 'N' 
} 

std::list, std::advance 통화 반복자에 operator++N 배처럼, 랜덤 액세스를 제공하지 않는 컨테이너를 들어. 당신의 표준 라이브러리의 구현을 제공하는 경우 또는, 당신은 std::next를 호출 할 수 있습니다

if (l.size() > N) 
{ 
    std::list<Object>::iterator it = std::next(l.begin(), N); 
} 

std::next 효과적으로 전화를 래핑되어 std::advance에, 쉽게 적은 코드 적은 가변 변수의 반복자를 N 시간을 향상시킬 수있다. std::next은 C++ 11에 추가되었습니다.

+7

랜덤 액세스가 부족하여 링크 된 목록을 검색 할 때 성능 저하가 발생하지만, 벡터 또는 큐의 중간에 데이터를 삽입하거나 제거해야 할 경우 훨씬 더 큰 성능 저하를 피할 수 있습니다. 질문에는 실제 용도에 이상적인 용기를 사용하고 있는지 판단 할 수있는 충분한 정보가 포함되어 있지 않습니다. – tloach

23

std::list은 색인이 지정된 요소를 가져 오는 기능을 제공하지 않습니다. 일부 코드를 작성하여 얻을 수는 있지만 권장하지 않는 경우가 많습니다. 자주 그렇게해야 할 경우 비효율적 일 수 있기 때문입니다.

std::vector이 필요합니다. 더 배열이 없다

std::vector<Object> objects; 
objects.push_back(myObject); 

Object obj = objects[0]; //get element given an index 
4
std::list<Object> l; 
std::list<Object>::iterator ptr; 
int i; 

for(i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++); 

if(ptr == l.end()) { 
    // list too short 
} else { 
    // 'ptr' points to N-th element of list 
} 
관련 문제