1


0

私は4つのstd

vectorコンテナを持っています。それらはすべて要素を含んでいてもいなくてもかまいません。 私はそれらのどれが最も多くの要素を持っているのかを判断し、それを後で使用したいです。

私は、それぞれのサイズをキーとして、そしてそれらのコンテナへの参照を値として持つstd

mapを作成しようとしました。 次に、各ベクトルのsize()にstd :: maxを適用して最大値を求め、std :: mapを介してアクセスしました。

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

誰もが優雅な解決策を考えることができますか?

6 Answer


13


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

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

編集:

今ポインタで!

編集(280×28):

今参照で! :)

編集:

参照付きのバージョンは動作しません。 Pavel Minaevはコメントでそれをうまく説明しています:

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

ポインターバージョンはおそらくあなたの最善の策です:それは迅速、低コスト、そして簡単です。

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


9


これは一つの解決策です(Pestoの非常に直接的なアプローチは別として) - 説明のために `bind`とC 0xのラムダを避けましたが、それらを使って別の関数の必要性を取り除くことができます。 私はまた、同じ数の要素を持つ2つのベクトルのうち、どれを選ぶかは無関係だと思います。

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

void foo () {
    vector* vecs[] = {&vec1, &vec2, &vec3, &vec4};
    vector& vec = std::min_element(vecs, vecs + 4, size_less >);
}


1


これが私のとても簡単な方法です。 唯一の興味はあなたがそれを理解するのに基本的なcが必要なことだけです。

ベクトル* v [] = {


0


これは、比較のために任意の数のベクトルを参照するためにstd

vectorを使用したcopproの回答の修正版です。

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

void foo(){//元のベクトルへのベクトル保持ポインタを定義します。typedef vector <vector *> VectorPointers;

// VectorPointers vecsのリストを埋めます。 vecs.push_back(

ベクター


0


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

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

ベクトル* highest(){priority_queue、size_less> myQueue; ... ... myQueue.top()を返します。 }


-1


あなたはstd

multimapを使うことができます。 それは同じキーを持つ複数のエントリを許可します。