2017-09-19 8 views
1

저는 정수 벡터를 가지고 있으며 그 목록에서 많은 이동, 잘라내 기 및 변경 작업을 수행해야합니다. 하지만 ... 나는 주로 그 가치가 무엇인지에 따라 그 항목에 접근해야 할 것입니다.해당 항목에 대한 참조 벡터에서 연결된 목록 항목에 액세스하십시오.

그래서 내가 정리 한 것은 re-ordering 작업을 용이하게 할 std :: list (double-linked-list)를 사용하는 아이디어입니다. 그런 다음 정수 값으로 인덱싱 된 벡터를 생성합니다. 여기서 값은 std :: list 항목에 대한 참조 벡터입니다. 그렇게하면 목록의 특정 값을 찾기 위해 링크 된 전체 목록을 반복 할 필요가 없습니다. 이렇게 작은 참조 벡터를 갖게 될 것입니다.

어떻게 설정해야할지 모르겠다. 내가 붙어있어 어디 LinkedList의에 '원래'항목을 누르면

vector<int> original = { 1, 1, 0, 2, 1, 3, 1, 0 }; 
vector<vector<int*>> byNumber(4); 
list<int> linkedList; 
for (int i = 0; i < original.size(); ++i) { 
    linkedList.push_back(original[i]); 
    byNumber[original[i]].push_back(*linkedList[i]); 
} 

충분히 쉽게,하지만 byNumber에 대한 참조를 만드는 : 여기

내가 뭘하려고했는지의 샘플입니다 에. 나는 &(*linkedList[i])도 시도했다. 나는 이것을하기 위해 어떤 구문을 사용할 수 있는지, 그것이 가능할 지 여부에 대해서는 분명하지 않다. 또한 int * 대신 unique_ptr을 사용하여 손을 've습니다. 너무 문제가있는 경우 다시 전환 할 수 있습니다.

+1

'int *'는 목록 항목에 대한 참조가 아닙니다. * iterators *를 저장할 수도 있습니다. –

답변

0
여기

: 당신이 포인터를 저장하는

vector<vector<int*>> byNumber(4); 

하지 참조. 이 작업을 수행하여, 그것을 할 수 있습니다 :

vector<vector<int&>> byNumber(4); 

왜 저장하지 않는 반복자를 다음과 같이 : 반복자를 사용하는 조언을 바탕으로

vector<vector<vector<int>::iterator>> byNumber(4); 
+0

네가 맞아, 혼란스러워. 그 점을 지적 해 주셔서 감사합니다. 내가 정말로 조언이 필요한 실제 라인은 byNumber [original [i]]. push_back (??); 반복자 아이디어에 대해 자세히 설명 할 수 있습니까? 예를 들어, 참조에 대한 찬성은 무엇이며 성능 차이에 대해 알고 있습니까? – braks

+1

@braks 귀하의 디자인에 혼란 스럽습니다. 미안 해요! – gsamaras

+0

오, 알았어. (시도해 줘서 고마워. – braks

1

나는이 함께했다. 그러나 누군가가 더 단단한 해결책을 가지고 있다면 나는 그것을 듣고 싶어합니다.

vector<int> original = { 1, 1, 0, 2, 1, 3, 1, 0 }; 
vector<vector<list<int>::iterator>> byNumber(4); 
list<int> linkedList; 
list<int>::iterator it; 
for (int i = 0; i < original.size(); ++i) { 
    linkedList.push_back(original[i]); 
    it = linkedList.begin(); 
    advance(it, i); 
    byNumber[original[i]].push_back(it); 
}