0

これが私のコードです

typedef std::pair<unsigned long, unsigned long> link;

std::map<link, double> container;

私がやろうとしているのは、X から Y までの距離を計算し、container.insert(std::make_pair(link, distance)); としてコンテナーに格納することです。そして今、計算全体をやり直すのではなく、Y から X までの距離を計算する必要があるとします。格納されている値をコンテナーから取得します。つまり、リンクと距離です。

私の現在の実装は(X、Y)のみです

std::map<link, double>::iterator It = container.begin();
std::pair<unsigned long, unsigned long> k = link(X,Y);
It = container.find(K);
if(It != container.end()) {   distance = It->second; } 
else { /* distance = /* complex calc */ container.insert(std::make_pair(k,distance)); }

link(X,Y) と link(Y,X) が同じように扱われるように一般化するにはどうすればよいですか?

4

3 に答える 3

3

次のように、マップに別のキー コンパレータを使用します。

bool link_compare(link lhs, link rhs) // note: parameters taken by value
{
    if (lhs.first > lhs.second) std::swap(lhs.first,lhs.second);
    if (rhs.first > rhs.second) std::swap(rhs.first,rhs.second);
    return lhs < rhs;
}

std::map<link, double, bool(*)(link,link)> container(link_compare);

ただし、ジェネリックとlinkの代わりに、それに固有のデータメンバー名を持つ別のクラスを作成することを検討する必要があると思います. 、私の意見では、単一のオブジェクトとして渡す必要がある場合に、無関係なデータを含めるための簡単な修正です。あなたが持っているのは、明らかに非常に関連するデータです。たまたま適切なデータ メンバーを保持できるからといって、それを使用する必要があるとは限りません。firstsecondstd::pairstd::pair

于 2013-03-16T01:41:12.733 に答える
1

常にXとYを並べ替えてください。挿入、検索、削除するときは、最初にペアをソートしてから、そのソートされたペアをmapメソッドで使用します。

または、そのルールを適用する独自のlinkコンストラクタヘルパーを作成し、それらを作成するすべての場所で直接使用して、不必要に変換する必要がないようにします。

実際、特定の型を定義した場合は、型コンストラクターと演算子も作成することをお勧めします。これにより、将来その型が変更された場合でも、修正するためにすべてのコードを調べる必要がなくなります。それ。

于 2013-03-16T01:38:29.410 に答える
1

借りているmake_pair関数を作成します。このようにして、いつでも注文を維持できます。

typedef std::pair<unsigned long, unsigned long> link;
link make_my_pair(unsigned long x, unsigned long y) {
    if (x < y ) return std::make_pair(x, y);
    return std::make_pair(y, x);
}

私はここで解決策を見つけました。

于 2013-03-16T01:40:52.087 に答える