문제

클래스 A 객체의 벡터가 있습니다.

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

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

 std::vector<A *> *arranged;

내가해야 할 일은 V1, V2 등의 벡터를 결국 파괴하지 않고 배열 된 내부에 벡터를 넣는 것입니다. 그래서 나는 그 대상에 대한 포인터의 벡터가 ... 이것이 가능합니까? 그렇다면 가변 V1의 반복 예를 제시하고 해당 객체의 포인터를 배열로 추가 할 수 있습니까?

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

타이,

도움이 되었습니까?

해결책

자신의 비교기를 쓸 수 있습니다. 이 경우 비교기가 작동합니다 A*. 사용한 간단한 예 int 유형:

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;
}

다른 팁

내가 당신을 올바르게 이해한다면 - 당신은 일부 객체 유형 (a)을 포함하는 여러 벡터이며, 실제로 객체를 복사하거나 다른 벡터의 구성을 포함하는 새 벡터를 만들거나 다른 벡터를 만들고자합니다. 어떤 식 으로든 소유권을 소유하고 있습니까?

첫째 : 새로운 복합 벡터의 수명은 소스 벡터 중 어느 것도 변하지 않도록 분명히 존재합니까? 즉, 해당 포인터가 복합재의 수명 내에 무효화되면 복합 벡터의 소스 벡터에 원시 포인터를 가질 수는 없습니다.

그것에 대한 답이 "확실히, 포인터가 유효하게 유지 될 것"이외의 다른 것이라면, 공유 포인터 또는 유사한 것을 사용하는 것을 고려해야합니다. 따라서 소스 벡터를 변경하면 복합 벡터를 유효하지 않은 상태로 두지 않습니다 (즉 임의의 메모리를 가리키십시오).

소스 벡터가 복합재의 수명에 대한 자체 내용의 관점에서 변하지 않을 것이라고 가정하면 간단한 대답은 "예"입니다.

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의 내용 (사본 별)을 넣은 다음 정렬 된 컨테이너를 사용하고 요소를 삽입 할 때 정렬 할 수 있습니다). 포인터를 해석하고 대상 객체 자체에 어떤 정렬 조정을 적용하는 자신의 정렬 연산자를 정의해야합니다.

그것이 당신을 도와 주나요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top