Форум программистов, компьютерный форум CyberForum.ru

Склеивание двух vector'ов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
03.10.2010, 13:52     Склеивание двух vector'ов #1
Имеется два экземпляра класса std::vector. Я хочу один вектор прицепить к другому. Т..е на входе имеем вектора {1,2,3} и {4,5,6}, а хочется получить вектор {1,2,3,4,5,6}. Сейчас я обхожу поэлементно второй вектор и добавляю к первому, но это велосипед. Можно ли это сделать по-человечески?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
03.10.2010, 13:57     Склеивание двух vector'ов #2
http://cppreference.com/wiki/stl/vector/insert
Третий вариант insert'а не подойдет?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.10.2010, 13:58     Склеивание двух vector'ов #3
Evg, используй метод insert.
C++
1
v2.insert(v2.end(), v1.begin(), v1.end());
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
03.10.2010, 15:35  [ТС]     Склеивание двух vector'ов #4
Помогло.

Ну и традиционный высер в сторону тех, кто это придумал. Почему нельзя было сделать метод append? Просто при наличии такого метода можно было бы записывать конструкции типа "vec.append (func())" (т.е. результат вызова функции). А в таком варианте приходится заводить дополнительную переменную.

Вопрос касается того, что отсутствие подобного метода - это что-то из разряда того, что типа можно эту функциональность выполнить существующими средствами (insert) или потому что получится менее эффективная реализация?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.10.2010, 15:52     Склеивание двух vector'ов #5
Цитата Сообщение от Evg Посмотреть сообщение
Почему нельзя было сделать метод append?
Видимо, потому что его можно легко реализовать самостоятельно в виде свободной функции. Т.е. как раз таки:
Цитата Сообщение от Evg Посмотреть сообщение
эту функциональность выполнить существующими средствами (insert)
Стандартная же библиотека представляет лишь минимально необходимый набор методов.
Кроме того, ты наверняка заметил, что, не считая конструктора и метода swap (который был добавлен лишь из соображений эффективности), ни один из методов не принимает вектор - все работают с итераторами, т.е. все крутиться вокруг них. Благодаря этому ты можешь заставить вектор работать и со списками и обычными массива и т.п.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
03.10.2010, 16:03  [ТС]     Склеивание двух vector'ов #6
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Стандартная же библиотека представляет лишь минимально необходимый набор методов.
Мне не раз казалось, что это не есть так. Например метод empty по сути избыточный, потому как есть метод size.

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
... все работают с итераторами, т.е. все крутиться вокруг них.
Я не так часто и не так глубоко работал со всем этим хозяйством, чтобы "ощущать" это. Возможно, что корень проблемы именно в этом. Со временем может пойму
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.10.2010, 16:16     Склеивание двух vector'ов #7
Цитата Сообщение от Evg Посмотреть сообщение
Например метод empty по сути избыточный, потому как есть метод size.
Формально говоря, тип результата метода size, а именно size_type, зависит от типа контейнера (size_type обявлен внутри контейнера через typedef), emty же всегда возвращает bool. Кроме того класс std::string, которого можно назвать специализированным контейнером, не имеет метода size. Видимо для единообразности проверки пустоты контейнера и был введен метод empty.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
03.10.2010, 16:35  [ТС]     Склеивание двух vector'ов #8
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
единообразности
Ещё один момент, который я не учёл, когда думал о append. С другой стороны единообразие хорошо, но так или иначе пользователь работает с частностями.
Mr.X
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
03.10.2010, 17:35     Склеивание двух vector'ов #9
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
класс std::string... не имеет метода size.
В стандарте имеет.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.10.2010, 18:21     Склеивание двух vector'ов #10
Цитата Сообщение от Mr.X Посмотреть сообщение
В стандарте имеет.
Точно. Спасибо.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
03.10.2010, 18:26     Склеивание двух vector'ов #11
Цитата Сообщение от Evg Посмотреть сообщение
но так или иначе пользователь работает с частностями.
пользователь может поменять vector на deque, потом решит хранить в list, потом задумает свой контейнер написать - при этом запись будет все также работать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2010, 18:46     Склеивание двух vector'ов
Еще ссылки по теме:

Сортировка vector<vector<int>> C++
Склеивание двух массивов C++
C++ Склеивание двух двумерных массивов

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
03.10.2010, 18:46  [ТС]     Склеивание двух vector'ов #12
Цитата Сообщение от alex_x_x Посмотреть сообщение
пользователь может поменять vector на deque, потом решит хранить в list, потом задумает свой контейнер написать - при этом запись будет все также работать
Про частности я писал в том ключе, что, например, действие append имеет смысл для списков (связать два списка), но не имеет смысла (логического) для стека или дэка. Исходя из этих соображений не правильно добавлять в контейнер метод append, потому что это нарушит единообразие. Но для меня, как для программиста, было бы удобно наличие метода append, чтобы мне не пришлось его писать ручками. Я знаю, что я буду пользоваться вектором (массивом), а потому заранее знаю, что не буду переделывать ни в список, ни в стек
Yandex
Объявления
03.10.2010, 18:46     Склеивание двух vector'ов
Ответ Создать тему
Опции темы

Текущее время: 18:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru