Ошибка вставки карты C ++ с пользовательским ключом - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть пользовательский класс в качестве ключа на карте. Когда я пытаюсь вставить элемент в карту, программа завершается. Должна быть проблема с созданием ключа.

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

Программа завершается при вставке.

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Вы не можете определить размер массива только по указателю, как вы пытаетесь сделать в цикле for вашей operator< функции ... В какой-то момент вам придется передать вразмер массива, на который указывает data, чтобы вы не переполняли границы массива, на который указывает data.Поскольку data является указателем, sizeof(data) просто возвращает размер указателя на вашей платформе, а не размер массива, на который указывает data.

Для C ++, вместо использования выделенногомассив, вы можете использовать контейнер STL, который вы можете напрямую запросить размер объекта контейнера ... это может включать std::string, если это строковые данные, или std::vector<unsigned char>, если это просто набор двоичных байтов.

0 голосов
/ 08 декабря 2011

Следующие работы и гравюры А.

    #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;
        }
   }
0 голосов
/ 08 декабря 2011

Из вашего примера кода оператор <не будет вызван, потому что вы вставляете только один элемент в карту. И вы сказали, что не реализуете конструктор копирования. Таким образом, следующий код будет проблемой: </p>

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

private:
    char* data;
};
...