std :: map <MyClass, std :: vector <MyClass>> Ошибка сегмента. непонятность - PullRequest
0 голосов
/ 12 июля 2011

решено: Спасибо, разобрался благодаря хамону.Все сводится к попытке вызвать функцию для своего рода нулевого объекта.Он может использовать части объекта, но не другие.

Я понятия не имел, что это может даже произойти.

Вопрос

Я столкнулся с нечетной ошибкой сегментации с

std::map< IntVector3, std::vector<IntVector3> >. 

В моем файле MyClass.hpp я делаю это частное свойство:

std::map< IntVector3, std::vector< IntVector3 > > recurData;

В моем файле MyClass.cpp в конструкторе для MyClass я могу запустить

 std::vector< IntVector3 > pt;
 pt.push_back(IntVector3(1,2,3));
 recurData[IntVector3(1,2,3)] = pt;

Это работает правильно, и я не получаю ошибку.

Позже в программе я вызываю функцию в MyClass, которая делает то же самое, изменяя recurData.Не в конструкторе.Это вызывает ошибку сегментации.Нет никаких других изменений в моих знаниях, которые влияют на recurData.

Реализуемый IntVector3: http://pastebin.com/Hc83xapk

Есть много дополнительных операторов, которые я добавил, которые не нужны (> =,<= ...).(Я пытался следовать правилу 3) </p>

Единственная настоящая странность - это оператор <.Это использует std :: string для сравнения.Этот быстрый взлом должен работать для всех x, y, z, если они меньше 99. </p>

Спасибо за помощь, это сводит меня с ума.

1 Ответ

1 голос
/ 12 июля 2011

Использование строки для достижения функции сравнения (а) крайне неэффективно и (б) не работает.Он не предоставит вам строго-слабый порядок , который требуется для std::map.В частности, он не будет транзитивным, т. Е. Если a < b и b < c, он не обязательно даст вам a < c.Это полностью испортит std::map.

Типичная реализация < будет выглядеть примерно так:

bool operator< (const IntVector3 &a, const IntVector3 &b)
{
    if (a.z < b.z) { return true; }
    if (a.z > b.z) { return false; }
    if (a.y < b.y) { return true; }
    if (a.y > b.y) { return false; }
    return (a.x < b.x);
}
...