7

この質問は、 char を stdmap のキーとして使用することに直接関係しています。

渡された比較関数の機能と、型にキーとして必要な理由を理解していchar *ます。ただし、更新が実際にどのように機能するかはわかりません。

キーを更新している場合について知りたいです。std::map間の同等性を比較する方法をどのように知っていますか。キーをツリーに挿入する順序をマップに伝えるだけですconst char *cmp_str

stl_tree.hコードを少し掘り下げました( here から取得) が、あまり見つけることができませんでした。私の唯一の推測は、それが単純なメモリ比較を行っているということです。

stl_tree下位クラスがこの状況をどのように処理するか、または常に正しく処理しない場合、どのエッジ ケースが壊れるかに興味がありますか?

コード

#include <map>
#include <iostream>
#include <cstring>

struct cmp_str
{
    bool operator()(char const *a, char const *b)
    {
        return std::strcmp(a, b) < 0;
    }
};

int main ( int argc, char ** argv )
{

    std::map<const char*, int, cmp_str> map;

    map["aa"]  = 1;
    map["ca"]  = 2;
    map["ea"]  = 3;
    map["ba"]  = 4;

    map["ba"]  = 5;
    map["bb"]  = 6;

    map["ba"]  = 7;

    std::map<const char*, int, cmp_str>::iterator it = map.begin();
    for (; it != map.end(); it++ )
    {
        std::cout << (*it).first << ": " << (*it).second << std::endl;
    }

    return 0;

}

出力

aa: 1
ba: 7
bb: 6
ca: 2
ea: 3
4

2 に答える 2

6

まあ、cmp_str同一のキーを見つけるために使用できます。と の両方がcmp_str::operator(x,y)cmp_str::operator(y,x)返す場合false、重複したキーが見つかりました。本当にそれ以上のものはありません。

于 2012-10-15T18:27:07.563 に答える
6

順序付けられたコンテナーはすべて等価クラスを使用します: 2 つの値は、どちらも他方より小さくない場合、またはバイナリ述語を使用した表記法を主張する場合、等価aと見なされます。b!(a < b) && !(b < a)!pred(a, b) && !pred(b, a)

ポインターをマップ内に維持する必要があることに注意してください。ポインターが範囲外になると、奇妙な結果が得られます。もちろん、文字列リテラルは、プログラムの存続期間を通じて有効なままです。

于 2012-10-15T18:27:42.290 に答える