2012-05-01 32 views
1

文字列を十分に並べ替える必要があります。 これを行う最も簡単な方法は、十分なすべてをマップに入れることです。 メモリを効率的に使用するために、(str + i)という接尾辞を渡します。strはchar *で、iは位置接尾辞で始まります。しかし、私はこれらのマップを並べ替えるつもりはないことを知りました。ここでは例マップと部分文字列

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'; 
} 

が出力さ

 
    Who(key = first): obs score Score(value = second): 10 
    Who(key = first): artys score Score(value = second): 15 

で行くしかし、strcmp、文字列を比較するための標準的な機能は、ボブ+ 1とマーティ+ 1のために正常に動作します。それはmarty + 1がbob + 1よりも小さいことを示しています。

+0

は 'Comparator'どのようなものです:

比較機能を実装するための正しい方法は、以下のでしょうか? – hmjd

+1

'Comparator'はどこに定義されていますか? –

+0

もちろん、Comparatorはマップの定義方法( 'char *'、int)... – ShinTakezou

答えて

5

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

EDIT:あなたは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 
+0

に対して間違っているか、使用するコンパレータを変更する – ShinTakezou

+0

@ShinTakezou、そうです。 OPは既に試みたかもしれないと思う。 – hmjd

+0

strcmpのインクルードcstringがありません – ShinTakezou

0

がカスタムコンパレータを定義し、例えば

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

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

+0

これはうまくいきません。なぜなら、lhsがrhsより大きい場合と小さい場合の両方で、strcmpはゼロ以外の値(true)を返します。 '<0'を追加する必要があります(hmjdの回答のように) – ShinTakezou

0

エラーが発生している可能性が高いので、使用している比較クラスまたは関数を追加する必要があります。
strcmpとマップ比較機能には若干の違いがあります。 、== Bの場合は0を返すのstrcmp -1 < B 1> B
COMPがtrueを返す場合には< Bである場合

、そうでない場合はfalse。

bool operator() (char* lhs, char* rhs) const 
{ 
     return strcmp(lhs,rhs) < 0; 
} 
+0

はい、それが助けになりました!どうもありがとう! –