2011-12-08 13 views
0

マップのキーとしてカスタムクラスがあります。マップにアイテムを挿入しようとすると、プログラムは終了します。キーの作成には問題があります。カスタムキーを使用したC++マップの挿入に失敗しました

class MyKey { 
    char* data; 
    bool operator<(const MyKey& s) const { 
     for(int i = 0; i < (int)(sizeof(data)/sizeof(char)); i++) { 
      if(data[i] > s.data[i]) 
      return false; 
     } 
     return true; 
    } 
} 

map<MyKey, char>* map = new map<MyKey, char>; 
MyKey* key = new MyKey(...); 
map->insert(make_pair(*key, '0')); 

プログラムは、インサートで終了します。

+1

はあなたがMyKey' 'のMYKEY'の実装::演算子<() 'と定義を投稿できる作品や版画A.以下の(メンバ変数とコピーコンストラクタと代入演算子を参照する必要があります)。 – hmjd

+0

キークラスに情報を追加しました – dbrettschneider

+3

MyKeyにコピーコンストラクタがありますか?実装は何ですか? – Shawnone

答えて

4

operator<関数のfor-loopで何かしようとしているように、ポインタだけから配列のサイズを決定することはできません。ある時点で、配列のサイズがdataで指し示されているので、配列dataの境界がオーバーフローしないようにします。 dataはポインタなので、sizeof(data)は、指し示す配列のサイズがdataではなく、単にプラットフォーム上のポインタのサイズを返します。

割り当てられた配列を使用するのではなく、コンテナオブジェクトのサイズを直接照会できるSTLコンテナを使用する必要があります。文字列データの場合はstd::string、そうであればstd::vector<unsigned char>バイナリバイトの束。

0

例のコードから、オペレータ<は呼び出されませんでした。これは、マップに1つの要素しか挿入しないためです。コピーコンストラクタを実装していないと言っています。だから、次のコードは、問題のようになります。

class MyKey { 
public: 
    MyKey() 
    { 
     data = new char[10]; 
    } 
    ~MyKey() 
    { 
     delete data; 
    } 

private: 
    char* data; 
}; 
0

#include <iostream> 
    #include <map> 
    using namespace std; 

    class Key 
    { 
    public: 
     Key(int x):data(x) {} 
     bool operator<(const Key &k) const { return(data < k.data); } 
    private: 
     int data; 
    }; 

    int main() 
    { 
     Key myKey(10); 
     map<Key, char> m; 
     m.insert(make_pair(myKey, 'A')); 
     map<Key, char>::iterator it = m.find(myKey); 
     if (it != m.end()) 
     { 
      cout << (*it).second << endl; 
     } 
    } 
関連する問題