Не мог бы кто-нибудь объяснить мне эту строку?

#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».