Вопрос

Я пишу некоторые примеры кода из «Как думать как компьютерный ученый в 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 из -за предупреждения о несоответствии компилятора, но я чувствую, что возвращается без знака INT или INT имеет несколько вопросов: 1) Int не будет принимать достаточно большой векторный индекс. 2) Возвращение USINGENDET INT не позволит мне вернуть -1. 3) Unsigned int не равен size_t во всех архитектурах (я также занимаюсь программированием микроконтроллера на коре Arm Cortex-M3).

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

Это было полезно?

Решение

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

Другие советы

INT составляет 32 бит на 32/64 -битные Windows и Linux. Я буду усекнут, если больше двух на 31 -м. Вы можете использовать Unsigned Int, и ваша программа будет в порядке, если не хранить более 4 г элементов в векторе :)

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

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

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

Если вы в порядке с этим, вы также можете использовать Boost :: Необязательно

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top