2009-10-22 4 views
1

클래스 A 객체의 일부 벡터가 있습니다.어떻게 byvalue의 벡터를 가지고 포인터의 벡터를 함께 사용합니까?

 std::vector<A> *V1; 
std::vector<A> *V2; 

A 포인터의 벡터가있는 함수가 있습니다.

 std::vector<A *> *arranged; 

필요한 것은 벡터를 넣는 것입니다. V1, V2 등에서 배열을 파괴하지 않고 배열 해 놓았습니다. 그래서이 객체에 대한 포인터 벡터가 가능하다고 생각합니까? 예인 경우, 변수 V1을 사용하여 반복의 예제를 제공하고 이러한 오브젝트의 포인터를 배열에 추가 할 수 있습니까?

당신은 일시적으로 3 개의 벡터 벡터를 하나의 벡터로 정렬해야하지만 3 개의 벡터의 메모리를 엉망으로 만들고 싶지는 않다고 상상해보십시오.

ty,

Joe

답변

2

당신은 당신의 자신의 비교를 작성할 수 있습니다. 이 경우 비교기는 A*에서 작동합니다. 당신은 어떤 개체 유형 (A)를 포함하는 여러 벡터를했습니다 당신은 다른 모든 구성원의 구성을 포함하는 새로운 벡터를 만들려면 - 내가 제대로 이해하면

void fun(vector<int*>* vec) 
{ 
    ///////// 
} 

bool comp(int* lhs, int* rhs) 
{ 
    return *lhs < *rhs; 
} 

int main() 
{ 
    vector<int> first, second; 
    vector<int*> vec; 

    for(vector<int>::size_type i = 0; i < first.size(); ++i) 
     vec.push_back(&first[i]); 
    for(vector<int>::size_type i = 0; i < second.size(); ++i) 
     vec.push_back(&second[i]); 

    // write your own comparator! provided above: comp 
    sort(vec.begin(), vec.end(), comp); 

    fun(&vec); 

    return 0; 
} 
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 벡터의 항목에 포인터를 추가하면 복사가되지 않고 그냥 가리키고 있을까요? 내 이해 문제는 그 벡터가 스택 물건과 힙이 아니라는 것입니다, 그래서 어떻게 외부 기능을 가리킬 수 있습니까? 아니면 그냥 개념을 어지럽 혔습니까? 벡터 내에서 무언가를 푸시 백하면 힙에 다시 생성됩니까? – Jonathan

+0

변수의 주소를 'first'와 'second'로 푸시 할 때 'vec'에 내용을 넣을 때.'vec '를 정렬 할 때, 값들은 비교 될 것이지만, 그들 자신의 포인터는'vec'에서 교체 될 것입니다. – AraK

+0

고마워, 나는 아직도 hean과 stack에 관한 몇 가지 질문을 가지고 있지만 google에서 공부할 것이다. 귀하의 답변을 표시하고 포인트를 주셔서 감사합니다, 감사합니다! – Jonathan

0

: int 유형을 사용하여 간단한 예 실제로 주위에 객체를 복사하지 않거나 다른 방법으로 소유 벡터를 방해하지 않는 벡터입니까?

첫 번째 : 새로운 합성 벡터의 수명이 원본 벡터가 변경되지 않도록 명확하게 존재합니까? 즉, 복합 포인터의 유효 기간 내에 해당 포인터가 무효화되는 경우 합성 벡터의 원본 벡터에 원시 포인터를 가질 수 없습니다.

"확실하게 포인터는 유효합니다"이외의 것이라면 공유 포인터 나 유사한 것을 사용하는 것이 좋습니다. 소스 벡터를 변경하면 합성 벡터가 유효하지 않게됩니다. 상태 (즉, 임의의 메모리를 가리 키지 않음).

소스 - 벡터 당신의 복합체의 수명에 대한 자신의 내용 측면에서 변경되지 않습니다 가정하면, 그 간단한 대답이 "예"

vector<A> source1; 
vector<A> source2; 
vector<A> source3; 

vector<const A*> composite; // this is a sorted vector of the above vectors' contents (by pointer) 

복합 벡터를 들어, 당신은 필요 source1-3의 내용 (사본으로)을 그 안에 넣은 다음 정렬 (또는 정렬 된 컨테이너를 사용하고 요소를 삽입 할 때 정렬) 할 수 있습니다. 포인터를 역 참조하고 대상 객체 자체에 대한 정렬 알고리즘을 적용하는 고유 한 정렬 연산자를 정의해야합니다.

도움이 되었습니까?

+0

도움이되었지만 범위의 끝에서 벡터가 살아남지는 않을 것입니다. 설명 된대로 포인터가 사용되지만, 다른 함수와 주 함수의 끝에 사용되므로 삭제됩니다. it – Jonathan

+0

포인터가 무엇인지, 객체 수명 등을 정확히 이해하는 것이 성공적인 C++ 프로그래밍에 중요합니다. 포인터 컨테이너를 사용하면 포인터가 가리키는 전체 시간 동안 유효하게 유지해야합니다. 따라서 source1-3은 파괴되거나 (범위를 벗어남) 내용을 변경할 수 없으며 (물건을 삽입하거나 순서를 재지 정할 수 없거나) 복합체의 포인터가 원하는 객체가 아닌 임의의 정보를 가리킬 수 있습니다 그들에게). 아직 읽지 않았다면 Scott Myers Effective C++ 시리즈를 강력히 추천합니다. ;) – Mordachai