Использование перегруженных операторов «>» и «<» из векторного контейнера в C ++ STL (не разыменовывается) - PullRequest
0 голосов
/ 11 декабря 2011

Это довольно простой вопрос, и я думаю, что это сводится к тому, законно ли это. У меня есть класс с перегруженными операторами ">" и "<". Я пытаюсь сделать одно утверждение, которое будет возвращать true или false без необходимости объявлять итератор для класса, просто для «простоты». </p>

Вот пример того, о чем я говорю:

class Guy
{
  double bigness; //I'm not illiterate by the way

public:
  bool operator>(const Guy& that) {return (this->bigness > that.bigness);}
}; 

Хорошо, это прямо здесь должно работать. Теперь я создаю два вектора типа «парень» и хочу сравнить два члена в одном выражении, чтобы получить значение истинности для этого выражения, например:

vector<Guy> gang, mafia;
bool mafiaWins = (*(mafia.begin()) > *(gang.begin()));

Я не заполнял вектор, поэтому я не получил бы ничего разумного из этого кода. Но как мне заставить работать выражение (mafia.begin ()> gang.begin ())? Я знаю, что они оба возвращают итераторы; но разыменование их не работает. Использование .front () дает мне ту же ошибку. Я получаю подтверждение наличия итератора без разыменования (разве это не разыменование?). Мне интересно, если проблема не в том, чтобы сначала не сохранить его в итераторе ...

Спасибо за внимание

Решение:

Таким образом, код, который у меня есть выше (отредактированный с момента моей первой публикации), должен работать для выражения. Это не тот код, который у меня был в моем .cpp, поэтому он такой грязный. Вам не нужно использовать ссылку произвольного доступа, если вы пытаетесь достичь только первого члена вектора, а front () будет ссылкой для первого члена. Изначально я оставил вектор пустым в этом посте, потому что думал, что заполнять их не имеет значения, и, сделав это, я случайно получил то, что было моей проблемой в моем коде. Функция, которую я получал, получая векторы и проверяя их элементы, не проверяла, существуют ли элементы, которые я сравнивал, или нет. Таким образом, для любого, кто сталкивается с подобной проблемой утверждения, вы, возможно, пытаетесь разыменовать то, что не существует. Для проверки, является ли вектор пустым, есть функция-член, которую можно использовать.

Example:
bool thereIsWar = (!(mafia.empty() && !(gang.empty()));
if(thereIsWar)
  bool mafiaWins = (*(mafia.begin()) > *(gang.being()));

Надеюсь, это поможет любому с похожим вопросом

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

that является ссылкой.

Изменение:

bool operator>(const Guy& that) {return (this->bigness > that->bigness);}

Кому:

bool operator>(const Guy& that) {return (this->bigness > that.bigness);}

Убедитесь, что у вашего vector есть хотя бы один элемент перед тестированием:

vector<Guy> gang, mafia;

gang.push_back(Guy());  // Not sure you how you set 'bigness'.
mafia.push_back(Guy());

Итераторы разыменования для сравнения:

bool mafiaWins = (*mafia.begin() > *gang.begin()) ;
1 голос
/ 11 декабря 2011

Это должно работать, пока в векторе есть содержимое (я получаю сегфо, если они пусты).

bool mafiaWins = (*mafia.begin()) > (*gang.begin());

как следует

bool mafiaWins = mafia.front() > gang.front();

Если это не помогло, напишите точную ошибку.

Примечание: оператор меньше / больше, чем определено для итератора произвольного доступа для сравнения положения.

...