Где я могу искать определение size_type для векторов в STL C++?

Итак, в C ++, как и в простом C, по умолчанию мы можем работать только с символами ASCII. Char переменные содержат всего 8 бит (1 байт) для хранения значений, поэтому максимум - 2 ^ 8 = 256 различных символов могут быть закодированы одной переменной char. Одиночные кавычки (например, 'a') хранят переменные типа char, поэтому внутри них можно поместить только ASCII-символ. Ваш персонаж не является частью таблицы ASCII, и нам нужно изменить кодировку.

Для того, чтобы просто напечатать (а не сохранить / обработать) своего персонажа, вы должны использовать другую кодировку, например UTF-8. Вы можете сделать это программно:

std::setlocale(LC_ALL, /*some system-specific locale name, probably */ "en_US.UTF-8");
std::cout << "\u2260" << std::endl;

Или с помощью параметров командной строки для g ++ (например, -finput-charset = UTF-16 ). Как вы можете видеть, я использую двойные кавычки для вывода не-ASCII символов на консоль.

6
задан Micha Wiedenmann 2 December 2015 в 08:36
поделиться

7 ответов

Не принимайте тип контейнерного размера (или ничто больше введенное внутри).

Сегодня?

Лучшее решение на данный момент состоит в том, чтобы использовать:

std::vector<T>::size_type

Где T является Вашим типом. Например:

std::vector<std::string>::size_type i ;
std::vector<int>::size_type j ;
std::vector<std::vector<double> >::size_type k ;

(Используя определение типа мог помочь сделать это лучше для чтения),

То же идет для итераторов и всех других типов "в" контейнерах STL.

После C++ 0x?

Когда компилятор сможет найти тип переменной, Вы сможете использовать автоматическое ключевое слово. Например:

void doSomething(const std::vector<double> & p_aData)
{
    std::vector<double>::size_type i = p_aData.size() ; // Old/Current way

    auto j = p_aData.size() ;    // New C++0x way, definition
    decltype(p_aData.size()) k;  // New C++0x way, declaration
}

Править: Вопрос от JF

Что, если он должен передать размер контейнера к некоторому существующему коду, который использует, скажем, неподписанный интервал? – JF

Это - проблема, характерная для использования STL: Вы не можете сделать этого без некоторой работы.

Первое решение состоит в том, чтобы разработать код, чтобы всегда использовать тип STL. Например:

typedef std::vector<int>::size_type VIntSize ;

VIntSize getIndexOfSomeItem(const std::vector<int> p_aInt)
{
   return /* the found value, or some kind of std::npos */
}

Второе должно сделать преобразование самостоятельно, с помощью любого static_cast, с помощью функции, которая будет утверждать, идет ли значение за пределы целевого типа (иногда, я вижу, что код использует "символ", потому что ", Вы знаете, индекс никогда не будет идти вне 256", [я заключаю в кавычки из памяти]).

Я полагаю, что это могло быть полным вопросом сам по себе.

11
ответ дан 8 December 2019 в 13:03
поделиться

Согласно стандарту, Вы не можете быть уверены. Точный тип зависит от Вашей машины. Можно посмотреть на определение в реализациях заголовка компилятора, все же.

4
ответ дан 8 December 2019 в 13:03
поделиться

Я не могу предположить, что это не было бы безопасно в 32-разрядной системе, но 64-разрядный могла быть проблема (так как ints остаются 32 битами). Для сейфа, почему не только объявляют, что переменная вектор <MyType>:: size_type вместо неподписанного интервала?

3
ответ дан 8 December 2019 в 13:03
поделиться

В стандарте C++ только говорится, что size_t найден в <cstddef>, который помещает идентификаторы в <stddef.h>. Моя копия Harbison & Steele помещает минимальные и максимальные значения для size_t в <stdint.h>. Это должно дать Вам понятие того, насколько большой Ваша переменная получателя должна быть для Вашей платформы.

Ваш лучший выбор состоит в том, чтобы придерживаться целых типов, которые являются достаточно большими для содержания указателя на платформе. В C99 это было бы intptr_t и uintptr_t, также официально расположенным в <stdint.h>.

1
ответ дан 8 December 2019 в 13:03
поделиться

Пока Вы уверены, что неподписанный интервал в Вашей системе будет достаточно большим для содержания количества объектов, которые Вы будете иметь в векторе, необходимо быть в безопасности ;-)

0
ответ дан 8 December 2019 в 13:03
поделиться

Должно всегда быть безопасно бросить его к size_t. неподписанный интервал не находится достаточно в большинстве 64-разрядных систем, и даже неподписанный длинный не находится достаточно в Windows (который использует модель LLP64 вместо модели LP64 большая часть подобного Unix системного использования).

0
ответ дан 8 December 2019 в 13:03
поделиться

Я не уверен, как хорошо это будет работать, потому что я просто думаю первое, что пришло на ум, но утверждение времени компиляции (такой как BOOST_STATIC_ASSERT() или посмотрите Способы УТВЕРЖДАТЬ, что выражения во время изготовления в C) могли бы помочь. Что-то как:

BOOST_STATIC_ASSERT( sizeof( unsigned int) >= sizeof( size_type));
-1
ответ дан 8 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: