2012-03-05 3 views
1

"포인터"에 대한 주제를 읽었지만 여전히 질문이 있습니다. v.edge.begin() 이후포인터를 사용하는 조건

// graph.cpp 

struct Edge { 
    int from; 
    int to; 
    unsigned int id; 
    Edge(): from(0), to(0), id(0) {}; 
}; 

struct Vertex { 
    int label; 
    vector<Edge> edge; 
}; 

class Graph: public vector<Vertex> { 
    int gid; 
    unsigned int edge_size; 
}; 

내가 다른 파일에 대한 이해에서

bool get_forward_root (Graph &g, Vertex &v, vector<Edge*> &result) { 
    for(vector<Edge>::iterator it = v.edge.begin(); it != v.edge.end(); it++) { 
     if(v.label <= g[it->to].label) 
     result.push_back(&(*it)); 
    } 
} 

, it이 포인터로 볼 수있는 반복자를 선언하는 경우는, vector<Edge>의 첫 번째 Edge 목적이지만, &(*it) 무엇인가?

질문 2 g, &g, *g의 차이점은 무엇입니까? 나의 이해에서

:

  • &g는 메모리 주소입니다.
  • *g은 그래프 개체를 가리키는 포인터 포인터이므로 Graph * g = new Graph();를 사용할 수 있습니다.

    조건 1 :

    Graph *g = new Graph(); 
    g->gid = 0; 
    

    조건

  • g
  • 는 *의 g 및 g 사이의 차이가 예를 들어 우리가 두 개의 조건이 동일하고, 사용하는 방법 인 그래픽 오브젝트

인 2 :

Graph g; 
g.gid = 0; 

질문 3

아래의 의미는 무엇입니까? 우리가 g[it->to].label를 사용하는 이유

Graph &g 

이 아니라 매우 &g[it->to].label 감사합니다 :)

+6

적절한 책을 골라야합니다. 너는 많은 질문을 가지고있다. –

답변

5

질문 1 : 포인터와 같은 & (* IT)

it 행위이지만, 포인터하지 무슨. 포인터 인 경우 &*itit과 같을 것입니다. 일반적인 경우, &(*it)은 반복자 it이 가리키는 객체의 주소 (실제 포인터)입니다. 여기서는 & 연산자에 과부하가 없다고 가정 할 수 있습니다.

질문 2 : g, & g, * g의 차이점은 무엇입니까?

gg입니다. &g은 g의 주소입니다. *gg이 가리키는 객체입니다 (g가 포인터 인 경우). 당신의 2 가지 조건 (나는 당신이 조건이라고 부르는 이유를 이해하지 못합니다)은 거의 똑같습니다.

질문 3 : Graph &g?

이 그것은 참조라고 무엇인지. 정의되면 즉시 초기화해야합니다. 참조를 객체의 다른 이름으로 생각하십시오. (더 나은, 책을 읽고, 아래 참조).

귀하의 모든 질문은 괜찮은 C++ 초급 책에서 철저하게 답변 될 것입니다. 특히 Lippman의 C++ 입문서를이 용도로 권장합니다. 다른 좋은 제목은 here입니다.

+0

그래프 g; => g는 그래프 객체입니다. 그래프 g * = new Graph() => g는 g *에 대한 포인터 포인트입니다. 나는 g의 주소를 얻기 위해 g를 사용할 수있다. (나의 이해가 맞습니까?) 감사합니다. – LoveTW

1

it는 반복자이며, 포인터가 아닙니다. 기본적으로 포인터처럼 동작하며 (dereference 및 arrow 연산자는 오버로드 됨) 배열 인덱스 (++, --, += 등)는 다음 요소를 가리키는 반복자를 앞당긴다. 벡터의 경우 쓸모 없지만 멋지다. 다른 용기의 경우).

따라서 &(*it)은 반복기를 실제 포인터로 변환합니다. 이는 가리키는 대상의 주소를 사용합니다. 모든 요소가 인접한 메모리 영역에 저장되기 때문에 벡터에서 많은 차이를 만들지는 않습니다.

1

질문 1 : it은 포인터가 아니며 iterator입니다. 반복자는 특정 상황에 대해서만 포인터와 같이 과 다소 비슷하지만 포인터는 포인터가 아닙니다. 표현 &(*it)에서 *은 iterator를 역 참조하여 이 지정하는 실제 객체에 대한 참조를 얻습니다. &은이 개체의 주소 을 가져 와서 포인터 (실제로는 result에 필요한 포인터)와 함께 실제 포인터가됩니다.

질문 2 : g은 개체의 이름입니다. 식에서는 이 개체를 지정하고 개체 유형을가집니다. &g은 개체의 주소 인 입니다. 포인터 유형의 객체 (임시 임에도 불구하고). *g은 유효하지 않습니다. 적어도 사용자가 정의한 사용자가없는 한 Graph 유형은 다소 많은 작업을 수행하기 위해 operator* 또는 operator&을 오버로드 할 수 있습니다. (. g[it->to]으로, 예 감안할 때, 그것은 Graph 과부하 []이 분명하다, 이것은 보통의 정체성 a[b]*(a+b)가 보유하지 않는 것을 의미 것을 의미한다) 그리고 당신의 코드에서 gGraph하지 포인터입니다, 별칭과 같은 의 역할을하는 참조입니다. — 초기화 된 이름과 다른 이름입니다. Graph* gGraph g과 관련하여

: 오브젝트의 수명 (또는 Graph* g의 경우, 수명의 첨예 객체까지) 에서 중요한 차이가있다.

질문 3 : Graph& g은 운영자와 아무 관계가 없습니다. &; 그것 은 컴파일러에게 g이 참조임을 알리는 수단입니다. 참조 은 근본적으로 초기화 객체의 다른 이름입니다 (또는 초기화 객체에 다른 이름이없는 경우 이름 만 사용). 참조는 기능 매개 변수로 주로 사용됩니다 (배타적이지는 않음).

+0

get_forward_root에 g [vid]를 추가하면, 이것은 객체입니까? 왜 꼭지점 & v = g [vid]가 아닌 꼭지점 * v = g [vid]를 사용해야합니까? 감사합니다 :) – LoveTW

+0

'g [vid]'는 표현식입니다. 즉, 벡터의 요소에 대한 참조, 즉 별칭을 반환합니다. 포인터가 아니므로 포인터에 지정할 수 없습니다. (대개의 경우,'Vertex v = g [vid]'라고 쓰면 객체를 정의 할 수 있습니다.) –

+0

조언 해 주셔서 감사합니다! 그러나이 샘플 코드는 gSpan의 저자로부터 왔으며,'v = g [vid]가 아닌'& v = g [vid]'를 사용합니다. 목적을 알고 있습니까? 감사합니다 :) – LoveTW

관련 문제