Итак, в 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 символов на консоль.
Не принимайте тип контейнерного размера (или ничто больше введенное внутри).
Лучшее решение на данный момент состоит в том, чтобы использовать:
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.
Когда компилятор сможет найти тип переменной, Вы сможете использовать автоматическое ключевое слово. Например:
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
Это - проблема, характерная для использования 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", [я заключаю в кавычки из памяти]).
Я полагаю, что это могло быть полным вопросом сам по себе.
Согласно стандарту, Вы не можете быть уверены. Точный тип зависит от Вашей машины. Можно посмотреть на определение в реализациях заголовка компилятора, все же.
Я не могу предположить, что это не было бы безопасно в 32-разрядной системе, но 64-разрядный могла быть проблема (так как ints остаются 32 битами). Для сейфа, почему не только объявляют, что переменная вектор <MyType>:: size_type вместо неподписанного интервала?
В стандарте C++ только говорится, что size_t найден в <cstddef>, который помещает идентификаторы в <stddef.h>. Моя копия Harbison & Steele помещает минимальные и максимальные значения для size_t в <stdint.h>. Это должно дать Вам понятие того, насколько большой Ваша переменная получателя должна быть для Вашей платформы.
Ваш лучший выбор состоит в том, чтобы придерживаться целых типов, которые являются достаточно большими для содержания указателя на платформе. В C99 это было бы intptr_t и uintptr_t, также официально расположенным в <stdint.h>.
Пока Вы уверены, что неподписанный интервал в Вашей системе будет достаточно большим для содержания количества объектов, которые Вы будете иметь в векторе, необходимо быть в безопасности ;-)
Должно всегда быть безопасно бросить его к size_t. неподписанный интервал не находится достаточно в большинстве 64-разрядных систем, и даже неподписанный длинный не находится достаточно в Windows (который использует модель LLP64 вместо модели LP64 большая часть подобного Unix системного использования).
Я не уверен, как хорошо это будет работать, потому что я просто думаю первое, что пришло на ум, но утверждение времени компиляции (такой как BOOST_STATIC_ASSERT()
или посмотрите Способы УТВЕРЖДАТЬ, что выражения во время изготовления в C) могли бы помочь. Что-то как:
BOOST_STATIC_ASSERT( sizeof( unsigned int) >= sizeof( size_type));