Сравните с size_t, верните int? - PullRequest
5 голосов
/ 16 декабря 2010

Я пишу несколько примеров кода из «Как мыслить как компьютерный специалист на C ++», и этот пример посвящен обработке объектов и колод типа игральных карт. Я сталкиваюсь с такой ситуацией:

int Card::find(const std::vector<Card>& deck) const {
    size_t deckSize = deck.size();
    for (size_t i=0; i<deckSize; i++)
        if (equals(*this, deck[i])) return i;

    return -1;
}

Я не мог использовать «.length ()» для вектора в C ++ в Visual Studio 2010, как в тексте, и вместо этого мне пришлось использовать .size (), который возвращает (я полагаю) std :: size_type. Я подумал, что мог бы использовать size_t и избавиться от него, чтобы избежать проблем на разных архитектурах, как я читал, но мне интересно, если я вернусь i, но это больше, чем целое число, я выломаю программа

[Отредактировано, чтобы быть более конкретным в моем вопросе:] Как только я начал использовать векторы для больших вещей, чем карты, я подумал об использовании unsigned int из-за предупреждения о несовпадении компилятора, но я чувствую, что возвращение unsigned int или int имеет несколько проблем: 1) int не будет принимать достаточно большой векторный индекс. 2) возврат неподписанного int не даст мне вернуть -1. 3) unsigned int не равен size_t на всех архитектурах (я также занимаюсь программированием микроконтроллеров на ARM Cortex-M3).

Что мне делать, если у меня будет достаточно большой вектор?

Ответы [ 4 ]

3 голосов
/ 16 декабря 2010

Приведение с size_t на int не приведет к "краху" вашей программы, но это плохая практика. С другой стороны, STL включает в себя хороший find алгоритм того, что вы делаете.

2 голосов
/ 16 декабря 2010

int является 32-битным в 32/64-битных Windows и Linux. я получу усеченный, если больше, чем два на 31-м. вы можете использовать unsigned int, и ваша программа будет в порядке, если вы не сохраните более 4 G элементов в векторе:

0 голосов
/ 16 декабря 2010

Вы также можете вернуть std::pair<size_t, bool>, аналогично std::map insert().Второй аргумент шаблона означает успех или неудачу.

Если вы согласны с этим, вы также можете использовать boost :: необязательный

0 голосов
/ 16 декабря 2010

size_t обычно unsigned int, но вы не можете на это полагаться. Если оно больше int, вы не будете падать, вы просто переполнитесь (вероятно, отрицательным) числом.

Если у вас не будет нескольких десятков тысяч карт в одном векторе, я был бы рад вернуть int.

...