현재 코드가 무엇을하는지에 대한 빠른 통찰력 :
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.
왜 3 개 종류의 별명을 정의하는 코드의 라인 대신'은 IList = 표준을 사용하여 :: 목록를 작성,'? –
kfsone
또한,'vec.push_back (x)'는'vec'의 뒤쪽에'x'의 새로운 복사본을 생성하므로'vec'가 포인터로 저장하는 것을 변경하거나'std :: reference_wrapper '. – kfsone
@kfsone 첫 번째 접근법을 알지 못했지만 아직 C/CPP의 모든 개념에 익숙하지 않습니다. 최근 자바의 성능 저하로 이사 왔었습니다. 너의 두번째 코멘트가 나의 대답을 가지고있는 것 같아, 그렇지? –