1

私は 4 つの std::vector コンテナーを持っており、そのすべてに要素が含まれている (または含まれていない) 可能性があります。それらのどれが最も多くの要素を持っているかを判断し、後でそれを使用したいと考えています。

それぞれのサイズをキーとして、それらのコンテナーへの参照を値として std::map を作成しようとしました。次に、各ベクトルの size() に std::max を適用して最大値を計算し、std::map を介してアクセスしました。

明らかに、少なくとも 2 つのベクトルに同じ数の要素があると、これは問題になります。

誰でもエレガントなソリューションを考えられますか?

4

6 に答える 6

13

あなたはこれをひどく考えすぎています。ベクトルは 4 つしかありません。3 つの比較を使用して、最大のベクトルを決定できます。それを行うだけです:

std::vector<blah>& max = vector1;
if (max.size() < vector2.size()) max = vector2;
if (max.size() < vector3.size()) max = vector3;
if (max.size() < vector4.size()) max = vector4;

編集:

今ポインタで!

編集 (280Z28):

今すぐ参照してください!:)

編集:

参照のあるバージョンは機能しません。Pavel Minaev は、コメントでそれをうまく説明しています。

そうです、コードは参照を使用します。max を宣言する最初の行では、コピーは行われません。ただし、次のすべての行ではコピーが発生します。これmax = vectorNは、 max が参照の場合、参照が別のベクトルを参照する原因にはならないためです (一度初期化すると、別のオブジェクトを参照するように参照を変更することはできません)。代わりに、 と同じで max.operator=(vectorN)、単純vector1に がクリアされ、 に含まれる要素が vectorNコピーされて置き換えられます。

ポインター バージョンはおそらく最善の策です。これは、高速で、低コストで、シンプルです。

std::vector<blah> * max = &vector1;
if (max->size() < vector2.size()) max = &vector2;
if (max->size() < vector3.size()) max = &vector3;
if (max->size() < vector4.size()) max = &vector4;
于 2009-11-04T16:37:55.447 に答える
9

これが1つの解決策です(Pestoの非常に単純なアプローチは別として)-bind説明のためにC ++ 0xラムダを避けましたが、それらを使用して別の関数の必要性を取り除くことができます。また、同じ数の要素を持つ2つのベクトルでは、どちらを選択するかは無関係であると想定しています。

template <typename T> bool size_less (const T* lhs, const T* rhs) {
    return lhs->size() < rhs ->size();
}

void foo () {
    vector<T>* vecs[] = {&vec1, &vec2, &vec3, &vec4};
    vector<T>& vec = std::min_element(vecs, vecs + 4, size_less<vector<T> >);
}
于 2009-11-04T16:41:31.417 に答える
0

私はすべて考えすぎです:)
グループ内の最高/最低の要素を見つけるという一般的な問題については、コンパレータでpriority_queueを使用します:(
恥知らずにcopproからコピーし、変更します...)

template <typename T> bool size_less (const T* lhs, const T* rhs)
{
  return lhs->size() < rhs ->size();
}


vector* highest()
{
  priority_queue<vector<T>, size_less<T> > myQueue;
  ...
  ...
  return myQueue.top();
}  
于 2009-11-04T17:45:52.720 に答える
0

これは、std :: vectorを使用して、比較のために任意の数のベクトルを参照するcopproの回答の修正バージョンです。

template <typename T> bool size_less (const T* lhs, const T* rhs) {
    return lhs->size() < rhs ->size();
}

void foo () {
    // Define vector holding pointers to the original vectors
    typedef vector< vector<T>* > VectorPointers;

    // Fill the list
    VectorPointers vecs;
    vecs.push_back(&vec1);
    vecs.push_back(&vec2);
    vecs.push_back(&vec3);
    vecs.push_back(&vec4);        

    vector<T>& vec = std::min_element(
        vecs.begin(), 
        vecs.end(), 
        size_less<vector<T> >
    );
}
于 2009-11-04T16:54:15.487 に答える