2017-01-09 1 views
-6

구조체에 대한 포인터 배열을 저장하는 벡터를 선언하고 싶습니다. 내 코드는 다음과 같습니다 : -
도와주세요.구조체에 대한 포인터 배열의 벡터

#include <iostream> 

#include <vector> 
#define in(x) scanf("%lld",&x) 

#define out(x) printf("%lld",x) 

#define ll long long 

struct node { 

    ll from; 
    ll to; 
    ll rank; 
}; 

int main(){ 

    ll n,e; 
    in(n),in(e); 
    vector <node> edge; 
    for (int i = 0; i < e; ++i) 
    { 
     ll a,b; 
     in(a),in(b); 
     node val; 
     val.from=a; 
     val.to=b; 
     val.rank=i+1; 
     edge.push_back(val); 
    } 
    vector <node> **vec; 
    vec= new vector <node> *[n]; 
    vector <node>::iterator it; 
    for (it = edge.begin(); it!= edge.end(); ++it) 
    { 
     int a=(*it).from; 
     int b=(*it).to; 
     vec[a-1].push_back(it); 
     vec[b-1].push_back(it); 
    } 
return 0; 
} 

이렇게하면 오류가 발생합니다. 다른 방법이 있다면 알려주십시오. 미리 감사드립니다. 오류는 다음과 같습니다

In function ‘int main()’: 
tourists.cpp:60:12: error: request for member ‘push_back’ in ‘*(vec + (((sizetype)(((long unsigned int)a) * 8ul)) + 18446744073709551608u))’, which is of pointer type ‘std::vector<node>*’ (maybe you meant to use ‘->’ ?) vec[a-1].push_back(it); 

    ^

편집 : 나는 내 실수 있어요. 나는 벡터를 과도하게 사용하고 잘못 포인터를 조작했다. 내가 (솔루션)을 필요로 무엇
는 - 실제로 포럼에 물어 무엇

vector <int*> *vec; 
vec = new vector <int*> [2]; 
int a=3; 
vec[0].push_back(&a); 
for (int i = 0; i < 2; ++i) 
{ 
    vector <int*> :: iterator it; 
    for(it=vec[i].begin();it!=vec[i].end();it++) 
     cout<<" "<<*(*it); 
} 

: - 열세에

vector <int> **vec; 
vec = new vector <int> *[2]; 
int a=3; 
vec[0].push_back(&a); 

// vec[1].push_back(&a); 
for (int i = 0; i < 2; ++i) 
{ 
    vector <int>* :: iterator it; 
    for(it=vec[i].begin();it!=vec[i].end();it++) 
     cout<<" "<<*(*it); 
} 

나는 매우 죄송합니다, 내 처음 그래서 더 명확 않네했다 묻는 법. 모두에게 다시 한 번 감사드립니다.

+0

미안 해요, 제가 그것을 편집했습니다, 제발 도와주세요. @WhiZTiM –

+1

'벡터 ** vec' ('node's의 벡터 배열) 대신'vector vec' ('node **'의 벡터)를 사용 하시겠습니까? – CompuChip

+0

무엇이 잘못 되었습니까?'vec [a-1]'은'std :: vector *'유형이지만'std :: vector '유형으로 취급하고 있습니다. '. 만약 당신이 올바르게 처리했다하더라도, vec [a-1]에 할당 된 메모리는없고,'vec [a-1]'은'std :: vector :: iterator'가 아닌'node's를 저장합니다. –

답변

0

아마 이것은 주석이어야하지만 기술적으로 사용자의 질문에 답할 수는 없지만 문제의 대체 솔루션을 제공한다는 정당화와 함께 답변으로 게시하게됩니다.

이 코드 검토하지 않지만, 이제 (나중에 참조 용으로 만 제공 라인 번호) 코드 뭐가 잘못 시작하자 :

1 vector <int*> *vec; 
2 vec = new vector <int*> [2]; 
3 int a=3; 
4 vec[0].push_back(&a); 
5 for (int i = 0; i < 2; ++i) 
6 { 
7  vector <int*> :: iterator it; 
8  for(it=vec[i].begin();it!=vec[i].end();it++) 
9  cout<<" "<<*(*it); 
10 } 

첫째, 당신이 그들을 선언 변수를 초기화에 익숙해하시기 바랍니다. 그것은 읽고 경우에 나중에는 합리적인 값이 전에 실수로 vec을 사용할 수 라인 1과 2 사이에 코드를 추가 청소기입니다 : 두 번째

vector<int*> *vec = new vector<int*>[2]; 

, 당신은 new으로 메모리를 할당됩니다하지만 난 어떤 표시되지 않습니다 delete. 이 경우에는 프로그램이 끝나기 때문에 중요하지 않지만, 일반적으로 원시 포인터를 사용하려면 항상 할당 한 메모리를 해제해야합니다.

셋째, 3 행과 4 행에서 로컬 변수를 만들고 그 주소를 벡터에 저장합니다. 이 경우에도 작동하지만 프로그램을 리팩터링하고 벡터 (1 - 4 줄)를 만드는 코드를 함수로 이동하면 프로그램에 갑자기 정의되지 않은 동작 (UB)이 생깁니다. 특히 함수를 전달하는 경향이있는 벡터의 경우 원시 포인터를 저장하는 데주의해야합니다.

코드의 의도를 살펴보면 행렬 또는 숫자 쌍 목록을 저장하는 것만으로도 충분할 것으로 보입니다. 이것은 포인터를 이해하는 데 도움이되는 프로그래밍 연습이 아니라고 가정하고, 메모리 (할당)를 전혀 고려하지 않아도되는 솔루션을 찾아 보겠습니다.

당신이 필요로하는 행렬 인 경우, 벡터의 벡터 만드는 것이 좋습니다 : 당신은 그것을 만들 수 있습니다 당신이 필요로하는 모든이 (좌표에서) 숫자 쌍의 목록을 저장하는 경우

std::vector<std::vector<int>> matrix; 

std::vector<int> row; 
row.push_back(3); 
row.push_back(4); 
matrix.push_back(row); 

std::cout << "First entry is " << row[0][0] << ", " << row[0][1]; 

을 그 (것)들을 정확하게 저장해서 더 간단하십시오 : 수의 쌍 :

std::vector<std::pair<int>> matrix; 

std::pair<int> row(3, 4); 
matrix.push_back(row); 

std::cout << "First entry is " << row[0].first << ", " << row[0].second; 
관련 문제