2016-07-17 4 views
0

나는 이미 목록의 벡터와 3 개의 목록을 선언하고 그 3 개의 목록을 벡터에 추가했습니다. 이제 벡터만을 사용하여이 3 개의 목록 중 2 개에 몇 가지 요소를 추가하고 싶습니다.. 이것을 어떻게 할 수 있습니까?목록의 벡터에서 단일/다중 목록에 요소 추가

#include<iostream> 
#include<list> 
#include<vector> 
using namespace std; 


#ifndef ILIST 
#define ILIST list<int> 
#endif 

#ifndef VLIST 
#define VLIST vector<ILIST > 
#endif 

int main(int argc, char const *argv[]) 
{ 
    ILIST l1(4,10), l2(4,20), l3(4,30); 
    VLIST vec; 
    vec.push_back(l1); 
    vec.push_back(l2); 
    vec.push_back(l3); 
    //here I want to add 2 elements in l2 and 1 in l3 by using the vector only. 
    return 0; 
} 
+0

왜 3 개 종류의 별명을 정의하는 코드의 라인 대신'은 IList = 표준을 사용하여 :: 목록 를 작성,'? – kfsone

+0

또한,'vec.push_back (x)'는'vec'의 뒤쪽에'x'의 새로운 복사본을 생성하므로'vec'가 포인터로 저장하는 것을 변경하거나'std :: reference_wrapper '. – kfsone

+0

@kfsone 첫 번째 접근법을 알지 못했지만 아직 C/CPP의 모든 개념에 익숙하지 않습니다. 최근 자바의 성능 저하로 이사 왔었습니다. 너의 두번째 코멘트가 나의 대답을 가지고있는 것 같아, 그렇지? –

답변

2

현재 코드가 무엇을하는지에 대한 빠른 통찰력 :

ILIST l1(4,10), l2(4,20), l3(4,30); 

세 지역 변수
여기에 지금까지 내 코드입니다.

VLIST vec; 

로컬 벡터.

vec.push_back(l1); 

벡터는 이제 하나 이상의 IList의 일부를 저장하는 동적 메모리를 할당하고, 그 메모리에 (L1)의 후 복사 내용. 이 둘은 이제 독립적입니다.

#include <iostream> 
#include <list> 
#include <vector> 

using ilist_t = std::list<int>; 
using vecilist_t = std::vector<ilist_t*>; 

int main() 
{ 
    ilist_t il; // empty list 
    vecilist_t vec; // empty vector 

    vec.push_back(&il); // store address in vec[0] 

    vec[0]->push_back(42); // vec[0] has type `ilist_t*`, -> dereferences 

    for (int i : il) { 
     std::cout << i << '\n'; 
    } 
} 
: 당신은 당신이 목적지가 그것을 통해 개체를 조작 할 수 있습니다 기본적으로 도면이다 벡터를 갖고 싶어

, 당신은 포인터 나 벡터에 대한 참조를 저장해야하는거야

학습자라고 지적 했으므로 다음과 같은 원시 포인터를 사용하여 포인터가 가리키는 객체가 벡터를 통해 잠재적 인 사용 시간보다 오래 지속되도록 보장해야합니다.

벡터가 f에 의해 반환 됨 자동 저장 기간을 갖는 i의 주소를가집니다. 수명이 함수 범위의 끝에서 끝나고, 반환 된 객체의 포인터가 무효화되고 정의되지 않은 동작이 발생합니다.

--- 편집 --- 당신이 독립형 목록을 필요 이유는 분명하지 않다

. 당신이 원하는 모든 3 개 목록의 벡터 인 경우, 다음을 수행 할 수 있습니다 : 당신의 벡터 컴파일시 고정 된 크기를 가지고가는 경우

#include <vector> 
#include <list> 

using ilist_t = std::list<int>; 
using ilvec_t = std::vector<ilist_t>; 

int main() { 
    ilvec_t ilvec; 
    ilvec.resize(3); // now contains 3 empty lists. 

    // push a value onto the 2nd list 
    ilvec[1].push_back(42); 
} 

대신 표준 : 배열을 사용할 수 있습니다.

using ilarray_t = std::array<ilist_t, 5>; // compile time size fixed at 5. 
+0

'for (int i : il) { std :: cout << i << '\ n'; }'목록 자체가 아닌 벡터 객체를 사용하여 목록의 요소를 탐색 할 수 있기를 원합니다. –

+0

신경 쓰지 마, 알아 냈어. 코드의 두 번째 부분에서 문제를 극복 할 수있는 방법을 제안 해주세요. –

+0

@AkashAggarwal 독립 서적 목록이 필요한지 또는 필요한 모든 것이 목록 벡터인지 이해하려고합니다. 벡터를 통해 요소를'l2'에 추가하려면'vec [1] -> push_back (value);'를 사용하십시오. 코드의 두 번째 부분에서 의미하는 바가 있습니까? – kfsone