#c #vector #typedef
#c #вектор #typedef
Вопрос:
Хорошо, вот одна строка в C
typedef vector<double>::size_type vec_sz;
Я понимаю, что эта строка создает псевдоним с именем vec_sz. Но я не могу понять, почему здесь используется vector??? Что общего имеет typedef и vector. Я пытаюсь выяснить весь этот вечер, но все еще не понимаю.
Комментарии:
1. Позже вы могли бы объявить переменную
vec_sz count;
и сохранить в ней размер, возвращаемый вашим вектором<double> . Вероятно, это какое-то целое число. Человек, написавший этот код, вероятно, предпочитает использовать сокращенную форму vec_sz вместо полного объявления типа и, вероятно, считает, что если тип когда-либо изменится в будущем, изменение typedef в одном месте было способом изменить тип во всей ее кодовой базе.
Ответ №1:
vec_sz
теперь это псевдоним для типа данных, используемого для представления размера vector
(что почти всегда size_t
так). Итак, предположим, вы хотите проиндексировать элементы в векторе, вы бы использовали vec_sz
следующим образом:
for(vector<double>::size_type i = 0; i < some_vector.size(); i)
{
...
}
которая (благодаря typedef
) теперь эквивалентна:
for(vec_sz i = 0; i < some_vector.size(); i)
{
...
}
Вы можете задаться вопросом: «Зачем использовать vec_sz
? Почему я не должен просто использовать int
?». Что ж, это делает ваш код более переносимым и менее склонным полагаться на ваши предположения (которые могут быть ошибочными).
Конечно, лучше обращаться к элементам в vector через итераторы.
Ответ №2:
Классы могут иметь typedefs внутри них:
class foo {
public:
typedef int bar;
}
foo::bar my_int; // same as int my_int;
Вектор имеет typedef, который соответствует size_t
vector<double>::size_type my_int; // roughly the same as size_t my_int
// implementation may not use size_t
Это большой набор текста, поэтому вы можете ввести его снова, чтобы сделать строку короче:
typedef vector<double>::size_type vec_sz;
vec_sz my_int; // same as vector<double>::size_type my_int; which is the same as size_t my_int;
Ответ №3:
Каждый векторный класс (в вашем случае vector) определяет некоторый беззнаковый интегральный тип с именем size_type. Что-то вроде этого:
template<class T> vector {
typedef size_t size_type;
...
}
Ответ №4:
Этот тип используется в std::vector class для хранения размера. На многих платформах и операционных системах это может отличаться, и использование этого типа гарантирует, что вы правильно прочитаете его размер.
Например, в качестве типа размера можно использовать int . Однако, если тип размера вектора — unsigned int , когда вектор превышает максимальный размер signed int, могут возникнуть странные результаты.
Дополнительную информацию можно найти на http://en.wikipedia.org/wiki/C_data_types Как вы можете видеть, int гарантированно содержит не менее 16 байт, которые могут отличаться в разных операционных системах.
Ответ №5:
size_type
является элементом typedef из std::vector<double>
.
namespace std {
template <typename T> class vector {
public:
typedef __something size_type;
size_type size() const;
// ...
};
}
Стандарт избегает указания таких вещей, как «возвращаемый тип vector<T>::size()
is unsigned int
«, на случай, если реализация может поддерживать больше элементов в векторе, чем может быть представлено максимальным значением unsigned int
. Вместо этого он определяет некоторые типы элементов, определенные реализацией, поэтому библиотека может использовать любой тип, который имеет наибольший смысл, и пользовательский код может легко использовать этот тип.
Кроме того, vector<double>::size_type
и vector<char>::size_type
могут отличаться (хотя обычно они одинаковы).
Итак, в приведенном коде говорится «создайте другой typedef vec_sz
для типа библиотеки C , используемого для чисел элементов в векторах, содержащих double».