Может ли кто-нибудь объяснить мне эту строку? - PullRequest
0 голосов
/ 08 ноября 2011

Хорошо, вот одна строка в C ++

typedef vector<double>::size_type vec_sz;

Я понимаю, что эта строка создает псевдоним vec_sz.Но я не могу понять, почему вектор используется здесь ???Что вообще имеет typedef и vector.Я пытаюсь выяснить весь этот вечер, но все еще не понимаю.

Ответы [ 5 ]

2 голосов
/ 08 ноября 2011

Классы могут иметь внутри себя typedef:

class foo {
public:
  typedef int bar;
}

foo::bar my_int; // same as int my_int;

Vector имеет 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;
2 голосов
/ 08 ноября 2011

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?». Что ж, это делает ваш код более переносимым и менее склонным полагаться на ваши предположения (которые могут быть ошибочными).

Конечно, лучше обращаться к элементам в векторе через итераторов .

1 голос
/ 08 ноября 2011

Каждый вектор-класс (вектор в вашем случае) определяет некоторый беззнаковый целочисленный тип с именем size_type. Примерно так:

template<class T> vector {
  typedef size_t size_type;
  ...
}
0 голосов
/ 08 ноября 2011

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() равен unsigned int, вВ случае, если реализация может поддерживать больше элементов в векторе, чем может быть представлено максимальным значением unsigned int. Вместо этого она определяет некоторые типы элементов, определяемые реализацией, поэтому библиотека может использовать любой тип, наиболее подходящий для пользователя, и пользовательский код можетлегко использовать этот тип.

Кроме того, vector<double>::size_type и vector<char>::size_type могут отличаться (хотя они, как правило, одинаковы).

Таким образом, в цитируемом коде написано "make другой typedef * 1017"* для типа библиотеки C ++, используемого для чисел элементов в векторах, содержащих double ".

0 голосов
/ 08 ноября 2011

Этот тип используется в классе std :: vector для хранения размера. На многих платформах и ОС это может отличаться, и использование этого типа гарантирует, что вы правильно прочитаете его размер.

Например, можно использовать int как тип размера. Однако, если типом размера вектора является целое число без знака, когда вектор превышает максимальный размер целого со знаком, могут произойти странные результаты.

Дополнительную информацию можно найти на http://en.wikipedia.org/wiki/C_data_types Как видите, int гарантированно имеет не менее 16 байтов, которые могут различаться в разных операционных системах.

...