2013-10-11 5 views
4

Недавно я натолкнулся на этот код, но не совсем понял, что происходит.Построение векторов в C++

auto c = vector<int> {}; 

Что возвращает векторный конструктор?

Тогда этот код:

c = vector<int> {1,2,3,4,5 }; 

ли второй c в другом месте памяти в начальной c?

Является ли деструктор вызванным, когда c повторно инициализирован?

Я искал в Интернете, но не нашел примеров приведенного выше кода.

Как выше отличается

vector<int> c {}; 

Спасибо заранее за любую помощь.

+1

Короткий ответ: это 11 – jrd1

+1

C++, пожалуйста, используйте правильное форматирование, в противном случае текст в угловых скобках не будет отображаться правильно – codeling

+0

Что касается разницы между 'авто с = вектор {}; 'и' vector c {}; ', см. [Почти всегда авто] Herb Sutter (http://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/) стиль. – Angew

ответ

2

«Первый c» - это где определена переменная c (вектор int).

auto c = vector<int> {}; 

«second c» - это просто повторное присвоение значения c. Это не новая переменная, поэтому адрес памяти c не изменяется, а деструктор c не вызывается.

c = vector<int> {1,2,3,4,5 }; 

Что на самом деле происходит то, что вектор {1,2,3,4,5} создает временный объект типа вектора, который инициализируется из списка инициализации со значениями 1,2,3,4,5 , Этот временный объект затем передается конструктору копии c (или в C++ 11) конструктору перемещения, так что c заменяет его текущие значения (если они есть) значениями из временного объекта.

Деструктор для c не будет вызываться до тех пор, пока он не выйдет из области видимости (например, функция выходит или блок управления {}, в котором он был установлен).

5

«Как говорит jrd1, это функция С ++ 11.

Ключевое слово auto в основном означает, что вы позволяете компилятору„угадать“тип переменной.

Так c является регулярным vector<int> .

+3

«Угадай» немного суровый - если тип не может быть полностью выведен, он не будет компилироваться :) –

+0

Правда, я также поставлю двойные кавычки. :) – elnigno

+1

все еще отвечал на первую часть третьей части вопроса ... – codeling

3

Каков вектор конструктор возвращения?

пусто vector<int>; и компилятор выводит тип переменной c из этого вызова конструктора, то есть c получит тип vector<int>. auto в основном просто избавляет вас от ввода типа переменной два раза - это уже дано в вызове конструктора, теперь вам не нужно вводить его перед именем переменной во второй раз, вместо этого вы можете использовать auto.

Является ли второй c в другом месте памяти исходным c?

Нет, это тот же вектор; но значения от другого временного vector<int> (который содержит значения 1,2,3,4 и 5) присваиваются c через operator=. Это означает, что адрес c сам (&c) не будет изменен. Однако данные, которые он содержит (например, результат c.data()), могут и, вероятно, будут меняться.

Вызывается деструктор, когда c повторно инициализируется?

Not c Деструктор. Только один из временного.

+0

Чтобы уточнить бит ячейки памяти: '& c' не изменится, но' c.data() 'вероятно будет. – ComicSansMS

+0

хорошо пункт. возможно, стоит отметить – codeling

1

Первая и последняя строки функционально эквивалентны.

Для задания:

c = vector<int> {1,2,3,4,5 }; 

с не будут уничтожены или быть впоследствии находится в новой операции памяти. Что произойдет, так как безымянный второй вектор будет создан с 5 значениями, а vector::operator= будет использоваться для назначения содержимого этого вектора в c. Это произойдет в течение операции перемещения в C++ 11. Затем временный вектор будет уничтожен, а его деструктор называется, но не деструктором c.

1

C++ 11 содержит ключевое слово auto, которое делает Тип вывода для вас.
Это помогает значительно упростить код.
Пример:

auto itr = vec.iterator(); // instead of vector<int>::iterator itr 
Смежные вопросы