Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1

Почему vector v{vector{1, 2} }; имеет тип vector<int>

24.07.2020, 17:14. Показов 1245. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
std::vector v{std::vector{1, 2} };
Почему v выводиться как vector<int>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2020, 17:14
Ответы с готовыми решениями:

error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall Vector<int>::Vector<int>(void)" (?0?$Vector@H@@QAE@XZ) в функции _main
//Vector.h #include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;climits&gt; #include &lt;vector&gt; #include &lt;stdlib.h&gt; #include &lt;fstream&gt;...

Как можно увеличить размер вектора, который является элементом вектора vector<vector<int>>arr(n, vector <int>)
Написал программу, которая создает вектор 'а' векторов 'b', вектора 'b' содержат 2 числа. Стало интересно, как нужно изменить программу...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

12
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.07.2020, 17:29
Цитата Сообщение от _stanislav Посмотреть сообщение
Почему v выводиться как vector<int>
Потому что ты его инициализируешь списком int. Отрабатывает соответствующий argument deduction https://en.cppreference.com/w/... _deduction
When initializing from a single argument of a type that is a specialization of the class template at issue, copying deduction is generally preferred over wrapping by default:

std::tuple t1{1}; //std::tuple<int>
std::tuple t2{t1}; //std::tuple<int>, not std::tuple<std::tuple<int>>

std::vector v1{1, 2}; // std::vector<int>
std::vector v2{v1}; // std::vector<int>, not std::vector<std::vector<int>> (P0702R1)
std::vector v3{v1, v2}; // std::vector<std::vector<int>>
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.07.2020, 17:31
_stanislav,
Вложенный вектор формируется на основе конструктора который принимает initializer_list из int-ов, соответственно получаем вектор интов. Внешний вектор это просто обьект который формируется на основе вложенного вектора с типом vector<int>, поэтому такой тип. То есть внешний вектор это вектор из vector<int>. Принцип его формирования такой же как и для вложенного вектора

Добавлено через 1 минуту
Уточню что тип будет vector<vector<int>> а не vector<int>
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.07.2020, 17:36
Цитата Сообщение от Undisputed Посмотреть сообщение
Уточню что тип будет vector<vector<int>> а не vector<int>
std::vector v2{v1}; // std::vector<int>, not std::vector<std::vector<int>> (P0702R1)
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.07.2020, 17:38  [ТС]
oleg-m1973, Undisputed, а понятно вроде, вывод происходит при вызове копирующего конструктора, а не конструктора с initializer_list?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.07.2020, 17:42
Цитата Сообщение от _stanislav Посмотреть сообщение
oleg-m1973, Undisputed, а понятно вроде, вывод происходит при вызове копирующего конструктора?
Выводится из аргумента конструктора
Подробный алгоритм работы CTAD
1
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
24.07.2020, 17:49
Цитата Сообщение от Undisputed Посмотреть сообщение
[Уточню что тип будет vector<vector<int>> а не vector<int>
Это почему? Там конструктор копирования отработает
Чтобы был вектор векторов, надо либо размерность указать, либо ещё одно скобки:
C++
1
2
    std::vector v1{ 1, std::vector{1, 2} };
    std::vector v2{ { std::vector{1, 2} } };
2
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.07.2020, 17:55  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Выводится из аргумента конструктора
копирования?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.07.2020, 17:58
Цитата Сообщение от _stanislav Посмотреть сообщение
копирования?
в данном случае да. Что-то типа
C++
1
template <typename T> vector(const vector<T> &) -> vector<T>
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.07.2020, 18:43
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
not std::vector<std::vector<int>>
Цитата Сообщение от Black Fregat Посмотреть сообщение
Там конструктор копирования отработает
Да, вы правы. Спасибо.
Я проверял на gcc 7.4.0 и тип выводился как vector<vector<int>>
похоже в более свежих версиях это исправлено и тип выводится как vector<int>

_stanislav,
сори, я ошибся

Добавлено через 17 минут
_stanislav,
Убери плиз плюс который ты поставил на этот пост
Почему vector v{vector{1, 2} }; имеет тип vector<int>
это был очень неправильный пост
1
24.07.2020, 18:46  [ТС]

Не по теме:

Цитата Сообщение от Undisputed Посмотреть сообщение
Убери плиз плюс который ты поставил на этот пост
минус поставить? :)
тот плюс не за ответ а за отзыв.

0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
24.07.2020, 18:54
Цитата Сообщение от _stanislav Посмотреть сообщение
минус поставить?
там вроде можно на крестик нажать возле единички и просто единичка станет ноликом...
кстати то чем я говорил вроде как изначально и было
только потом решили убрать такой вариант и выводить тип в подобных случаях как vector<int>
http://www.open-std.org/jtc1/s... 702r1.html
C++
1
2
3
4
5
6
7
8
9
10
11
12
//g++  7.4.0
 
#include <iostream>
#include <type_traits>
#include <vector>
 
int main()
{
    std::vector v{std::vector{1, 2} };
    std::cout << v[0][1] << '\n'; // выводит 2
    std::cout << std::is_same<std::vector<std::vector<int>>, decltype(v)>::value; // 1, т.е true
}
https://rextester.com/HUGUZ51969
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,225
24.07.2020, 21:09
Цитата Сообщение от _stanislav Посмотреть сообщение
C++
1
std::vector v{std::vector{1, 2} };
Почему v выводиться как vector<int>
У вас в этом примере два вывода std::vector как vector<int>. В обоих случаях вывод производится через неявно сгенерированные deduction guides.

Для внутреннего std::vector это неявный deduction guide, полученный из конструктора для std::initializer_list<int>.

Для внешнего std::vector это специальный неявный deduction guide, сгенерированный для копирования.

Если вопрос именно в том, почему во втором случае выбран конструктор копирования (перемещения), а не std::initializer_list<std::vector<int>>, то это потому, что, как уже заметил oleg-m1973, для обработки случая копирования специально сделано исключение, т.е. в алгоритме генерации неявных deduction guides (https://en.cppreference.com/w/... _templates) искусственным образом добавляется правило для копирования

"In any case, an additional fictional function template derived as above from a hypothetical constructor C(C) is added, called the copy deduction candidate."

Этот copy deduction candidate обычно будет более специализированным, чем вариант с std::initializer_list<std::vector<int>>, т.е. "побеждать" будет именно копирование.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2020, 21:09
Помогаю со студенческими работами здесь

Нюансы синтаксиса: что означает запись vector<int*> a и vector <int>*a ?
Часто встречается вот такая запись: vector&lt;int&gt; a; это понятно что. Массив объектов int А вот что такое vector&lt;int*&gt; a; ...

Цикл: Создайте класс Matrix на базе вектора vector<vector<int>>.
Создайте класс Matrix на базе вектора vector&lt;vector&lt;int&gt;&gt;. Определите операторную функцию ostream\&amp; operator&lt;&lt;(ostream\&amp;,...

Ошибка [Linker error] undefined reference to `Vector::Vector(int)'
Добрый день. Делал по методички, и почему-то валятся ошибки... файл lab9_main.cpp #include &lt;iostream&gt; #include...

vector<Struct2{int,vector<struct1>}> или множественное наследование ...
Здравствуйте! Помогите, пожалуйста. Есть такие данные: typedef struct { int x; int y; // координаты...

Указатель на объект вектор в векторе vector < vector<int>* >*
Дело касается вот чего, есть такая вот незатейлевая вещь. #include &lt;vector&gt; #include &lt;iostream&gt; int main( ) { using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru