1

文字列のサフィックスを並べ替えたい。これを行う最も簡単な方法は、すべてのサフィックスをマップに入れることです。メモリを効率的に使用するために、接尾辞を (str+i) として渡します。ここで、str は char* で、i は開始位置の接尾辞です。ただし、 map はこれらのサフィックスをソートしないことがわかりました。ここに例があります

typedef std::map < char*, int,Comparator> MapType;
MapType data;

// let's declare some initial values to this map
char* bob=(char* )"Bobs score";
char* marty=(char* ) "Martys score";
data.insert(pair<char*,int>(marty+1,15));
data.insert(pair<char*,int>(bob+1,10));
MapType::iterator end = data.end();
for (MapType::iterator it = data.begin(); it != end; ++it) {
    std::cout << "Who(key = first): " << it->first;
    std::cout << " Score(value = second): " << it->second << '\n';
}

出力は

    誰 (キー = 1 番目): obs スコア スコア (値 = 2 番目): 10
    Who(キー = 1 番目): artys スコア スコア (値 = 2 番目): 15

ただし、strcmp文字列を比較するための標準関数は、bob+1 と marty+1 に対して正しく機能します。marty+1 は bob+1 よりも小さいと言われています。

4

3 に答える 3

5

は辞書順ではなくmap、 のアドレスでソートされますchar*。キーを a に変更するstd::stringか、コンパレータを定義します。

編集:

を定義しようとしたように見えますComparatorが、その定義は投稿されていません。次に例を示します。

#include <iostream>
#include <map>
#include <string.h>

struct cstring_compare
{
    bool operator()(const char* a_1, const char* a_2) const
    {
        return strcmp(a_1, a_2) < 0;
    }
};

typedef std::map<const char*, int, cstring_compare> cstring_map;

int main()
{
    cstring_map m;

    m["bcd"] = 1;
    m["acd"] = 1;
    m["abc"] = 1;

    for (cstring_map::iterator i =  m.begin(); i != m.end(); i++)
    {
        std::cout << i->first << "\n";
    }

    return 0;
}

出力:

abc
acd
bcd
于 2012-05-01T09:10:40.647 に答える
0

カスタム Comparator を定義します。

class compare_char { 
   public:
      bool operator()(const char* lhs, const char* rhs) { return strcmp(lhs, rhs); } 
};

現在持っているものの代わりに、このコンパレーターを使用してマップを定義します。または、値を操作する比較演算子を持つキー タイプのマップを使用します。 std::string の方が適しています。現在、char* タイプを比較するキーとして char* を使用するマップがあります。内容ではなく、ポインターの値。

于 2012-05-01T09:30:12.983 に答える
0

使用している比較クラスまたは関数を追加する必要があります。これは、エラーの原因である可能性が高いためです。
strcmp とマップ比較関数には若干の違いがあります。

strcmp は、a == b の場合は 0、a < b の場合は -1、a > b の場合は 1 を
返し、comp は a < b の場合は true、それ以外の場合は false を返します。

比較関数を実装する正しい方法は次のとおりです。

bool operator() (char* lhs, char* rhs) const
{
        return strcmp(lhs,rhs) < 0;
}
于 2012-05-01T09:32:58.463 に答える