byvalueのベクターを作成し、ポインターのベクターを組み合わせて使用​​する方法は?

StackOverflow https://stackoverflow.com/questions/1609121

質問

クラスAオブジェクトのベクターがいくつかあります:

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

etc

Aのポインターのベクトルを持つ関数があります:

 std::vector<A *> *arranged;

やらなければならないことは、V1、V2などのベクターを最後に破棄せずに配置することです。したがって、これらのオブジェクトへのポインターのベクターは...これが可能だと思いました。 はいの場合、変数V1の反復の例を挙げて、それらのオブジェクトのポインターを配置に追加できますか?

一時的に、オブジェクトの3つのベクトルを1つのベクトルにソートする必要があるが、3つのベクトルのメモリを台無しにしたくないと想像してください。

ty、

ジョー

役に立ちましたか?

解決

独自のコンパレータを作成できます。この場合、コンパレータは 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