2010-12-16 2 views
4

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

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) возврат unsigned int не позволит мне вернуть -1. 3) unsigned int не равен size_t для всех архитектур (я также занимаюсь программированием микроконтроллеров на ARM Cortex-M3).

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

+9

Вы должны рассмотреть возможность получения другой C++ книгу. Список [хороших вводных книг на C++] (http://stackoverflow.com/questions/388242/the-definitive-c++book-guide-and-list). Я не знаком с «Как думать как компьютерный ученый в C++», но его первый пример имеет «void main()» и использует ``. Это не выглядит многообещающим. – 2010-12-16 04:38:31

ответ

3

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

+0

Я не люблю использовать STL для программирования без ПК, так как я также научился писать для микроконтроллеров (в частности, ARM Cortex-M3). Кажется, что STL имеет возможность изменять размер кода при неправильном обращении. – darvelo 2010-12-16 18:45:50

0

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

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

+2

size_t, вероятно, не будет беззнаковым int на 64-битных платформах. – 2010-12-16 04:43:16

+0

Точно. Вот почему вы не можете полагаться на это. – Robert 2010-12-16 05:46:44

2

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

0

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

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

Смежные вопросы