Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/259: Рейтинг темы: голосов - 259, средняя оценка - 4.81
3 / 3 / 1
Регистрация: 04.04.2018
Сообщений: 351

Vector<string> в string

02.05.2019, 22:11. Показов 54800. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как преобразовать vector<string> в string?
C++
1
2
vector <string> test;
string str;
к примеру test в str
Думаю легко и я видимо не умею гуглить...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2019, 22:11
Ответы с готовыми решениями:

Доступ к паре в map<string, vector<pair<string, string>>>Temp
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string,...

Не могу вставить элемент в second(vector) мультимапа. multimap<string, vector<string>>
#include &lt;iostream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; #include &lt;string&gt; #include &lt;iterator&gt; int main() ...

Какое одинаковое значение можно вернуть из функций <string> f () и vector < <string> > f()?
Понятное дело, что всё обсуждение будет вертеться вокруг аналога NULL. char* f_0 () { return NULL; } char** f_1 () { ...

40
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
04.05.2019, 21:03
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
для списка, например?
Для чего угодно. Шаблоны как-никак.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Не у всех есть такой оператор по определению.
Правильно, поэтому есть возможность использовать удобство стандартной библиотеки для пользовательских нужд.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Посимвольно это не путь к победе.
А, это уже вопрос терминологии. Символы тоже разные бывают, как их лучше представлять зависит от кодировки.
Значит и как переносить - тоже. С практической точки зрения важны только удобство и производительность(именно в таком порядке т.к. большинство - пользователи, а не разработчики). Вот решение notAll - самое удобное, а с точки производительности - наоборот.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.05.2019, 21:40
Цитата Сообщение от S_el Посмотреть сообщение
Для чего угодно. Шаблоны как-никак.
Цитата Сообщение от S_el Посмотреть сообщение
Правильно, поэтому есть возможность использовать удобство стандартной библиотеки для пользовательских нужд.
Удобство не в этом (имхо). Удобство в том, чтобы их использовать эффективно. У accumulate есть версия использующая оператор + и версия которой можно передать бинарную операцию (функцию). Давайте напишем свободный оператор + для списка
C++
1
2
3
4
5
6
7
8
template<class T>
list<T> operator+(const list<T>& rhs, const list<T>& lhs)
{
list<T> ret;
    ret.insert(ret.end(), rhs.begin(), rhs.end());
    ret.insert(ret.end(), lhs.begin(), lhs.end());
    return ret;
}
rvo спасёт от копирования при возврате. Остальное нужно будет сделать вручную и опять же insert. Но будет создаваться локальный объект. Не думаю, что это быстрее. Кроме всего в пространстве кода появится оператор не стандартный...
С другой стороны, если бы был += (с ссылкой на объект результат), то всё копировалось бы в зарезервированную область. У списка её нет, но это частный случай, неудачный для пояснения ситуации. А выполнить += свободной операцией нельзя, ей нужен объект.

Добавлено через 5 минут
Цитата Сообщение от S_el Посмотреть сообщение
А, это уже вопрос терминологии.
Нет. Напишите то что предлагаете для суммирования строк из вектора строк и поймёте, что суммировать надо строки - элементы в итоговую строку а не во вложенном цикле по строкам элементам итерировать по символам строк и пушить их в итоговую строку. Это даже не вопрос не то, что терминологии, но и алгоритма.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
04.05.2019, 22:43
Цитата Сообщение от IGPIGP Посмотреть сообщение
Нет. Напишите то что предлагаете для суммирования строк из вектора строк и поймёте, что суммировать надо строки - элементы в итоговую строку а не во вложенном цикле по строкам элементам итерировать по символам строк и пушить их в итоговую строку. Это даже не вопрос не то, что терминологии, но и алгоритма.
Стоп. Мы сейчас о чем конкретно говорим?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 00:14
Цитата Сообщение от S_el Посмотреть сообщение
Стоп. Мы сейчас о чем конкретно говорим?
Рад вашему вопросу. Прочтите его и подумайте о том, что я могу на него ответить. S_el, спросите конкретно и я постараюсь ответить. Что касается push_back то я не говорил намёками или сложными гиперболами. Я предложил вам написать код по задаче и увидеть, что работа += для string и push_back для неё же, похожа только с точки зрения самых общих выражений. Оба что-то в строку добавляют. При этом я не утверждаю, что строку к строке нельзя добавить посимвольно. Это просто не нужно с моей точки зрения.
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 00:23
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это просто не нужно с моей точки зрения.
Не нужно. Речь шла про возможное универсальное решение, на которое я отвлекся. Посмотрел в справочнике и действительно std::string не имеет перегрузку метода push_back для другой строки, но имеет функцию append.
А посимвольное копирование это про внутреннюю реализацию что для insert что для чего-то другого.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 00:31
Цитата Сообщение от S_el Посмотреть сообщение
но имеет функцию append
и для этого пришлось бы специализироваться. Но insert реализуют все и это позволяет решать всё в одной реализации. А вот контейнер списков в список так не преобразуется. У списков нет метода reserve и код не скомпилируется. Вот как могла бы выглядеть специализация для контейнера списков:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template< typename T, template<typename, typename> class Container >class ContainerTemplate<list<T>, Container>:public Container<list<T>, allocator<list<T>>>
{
public:
  list<T>  whole_inlet_containers2container()
  {
      list<T> result;
      for(auto a:*this)result.insert(result.end(), a.begin(), a.end());
      return result;
  }
};
 
//клиентский:
//ContainerTemplate<list<int> , vector> li{{{1,2,3},{4,5,6}}};//и этот
     ContainerTemplate<list<int> , list> li{{{1,2,3},{4,5,6}}};//и этот варианты работают с специализацией на list<T>
    auto _sum= li.whole_inlet_containers2container();
    for(auto a:_sum)
       cout<<a<<' ';
можно бы и со slice реализовать, но это разрушает исходник, хотя и намного быстрее. Важно, что можно сделать именно то, что нужно.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 09:15
Цитата Сообщение от IGPIGP Посмотреть сообщение
У списков нет метода reserve и код не скомпилируется. Вот как могла бы выглядеть специализация для контейнера списков:
Спискам он и не нужен, весь смысл reserve в получении блока памяти, так что парочку специализаций все равно пришлось бы вводить.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 09:54
Цитата Сообщение от S_el Посмотреть сообщение
Спискам он и не нужен
Это спорный вопрос? Нет. Это не вопрос. Глупо выделять поэлементо то что можно выделить пулом. При массовых операциях это единственный разумный подход. S_el, тут тоже просматривается желание работать "курочка-по-зёрнышку".
У списков есть resize имеющий ту же семантику. Но боль в том, что вся стандартная библиотека - зверинец разношерстной фауны. Присмотритесь. Разные названия для сходных семантик, разные порядки задания аргументов(!)... Метод копирования требует пары для интервала источника а затем итератор назначения а метод вставки - сначала итератор назначения а потом пару итераторов источника. Это значит, что эффективно работать без применения таких вот трюков (не простых) нельзя. И это сделано людьми для людей. Вот более полная специализация для списка, которая учитывает заблаговременную аллокацию путём ресайз (нужно раскомментировать вызов) :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template< typename T, template<typename, typename> class Container >class ContainerTemplate<list<T>, Container>:public Container<list<T>, allocator<list<T>>>
{
public:
    ContainerTemplate(const list<list<T>>& contList)
    {
     for(const auto & a:contList) this->push_back(a);
    }
 
    size_t inlet_whole_length(){
        size_t result(0);
            for(auto it: *this)
            {
                result+=it.size();//этот вызов медлителен и обесценивает всю функцию
            }
        return result;
      }
 
  list<T>  whole_inlet_containers2container()
  {
      list<T> result;
     // result.resize(inlet_whole_length());//интересно, что если раскомментировать то
      //получается более медленно. Причина скорее всего в медленном подсчёте длин списков
      //который требует последовательного прохождения
      for(auto a:*this)result.insert(result.end(), a.begin(), a.end());
      return result;
  }
};
он показывает, что резервирование не имеет смысла по другой причине. Весь алгоритм (и без того не быстрый для списка) становится в полтора раза медленнее. Но из-за того что при подсчёте общей длины каждый вызов size() на списке приводит к проходу данного списка от начала и до конца. Список стл (оговорюсь, - для MigGW) не умеет хранить свою длину а арифметика итераторов не применима для него (как для вектора, скажем). И это еще одна "светлая" частичка стандартной библиотеки. Этот разговор трудно остановить начав, но нужно остановить. Тема тут другая и она огромна. Бесплатные средства и жизнь. Вот почему специализация стратегий - путь к победе.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 13:58
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но боль в том, что вся стандартная библиотека - зверинец разношерстной фауны. Присмотритесь. Разные названия для сходных семантик, разные порядки задания аргументов(!).
Так я это и сам знаю. Поэтому предпочитаю даже не пытаться создать универсальное решение там, где это не нужно.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Этот разговор трудно остановить начав, но нужно остановить. Тема тут другая и она огромна. Бесплатные средства и жизнь. Вот почему специализация стратегий - путь к победе.
Да, давайте остановим.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 14:16
Цитата Сообщение от S_el Посмотреть сообщение
Поэтому предпочитаю даже не пытаться создать универсальное решение там, где это не нужно.
Специализация шаблонов вообще и стратегий в частности, это как раз возможность скрыть за универсальностью вызова специальные (оптимальные для...) решения. S_el, вы вправе решать для себя как поступить, но вся стандартная библиотека (и boost и платные) это набор универсальных решений. Вы имели неосторожность предложить push_back вместо insert как лучший способ обобщения и ошиблись. Это бывает. Но если вам не нравится решение которое быстрее std::accumulate и оптимально работающее на
вектор строк -> строка
векторе списков -> список
список строк -> строка
список векторов -> вектор
список списков -> список
хух... хорошо, что нету строк векторов/списков (из коробки).

то или со временем вы измените своё мнение или нет.
Стратегии на наследовании потребовали бы кучи наследников и их комбинаций.
А стратегия на шаблонах, легко конфигурируются на типах при использовании, легко расширяется в процессе разработки по мере надобности не затрагивая клиентский и уже наработанный библиотечный код.
Цитата Сообщение от S_el Посмотреть сообщение
Да, давайте остановим.
Я имел ввиду обсуждение недостатков стандартной библиотеки. А по теме, готов говорить, если интересно. В ней много чего можно обсудить.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 14:26
Цитата Сообщение от IGPIGP Посмотреть сообщение
вы вправе решать для себя как поступить, но вся стандартная библиотека (и boost и платные) это набор универсальных решений.
именно что библиотека. Когда пишешь библиотеку - да, нужно стараться покрыть как можно больше случаев и как можно лучше. И тут в ход идут все инструменты какие только есть. А если в рядовой программе у тебя зверинец разных контейнеров к которым нужно применять один и тот-же метод, то с моей точки зрения была сделана ошибка при проектировании.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Но если вам не нравится решение которое быстрее std::accumulate и оптимально работающее на
Почему не нравится? Нравится, я это уже отмечал. Если бы я писал библиотеку, которая упрощала бы жизнь пользователям то может и сам бы поступил также(в первом приближении). Однако когда мне нужно просто сшить строки то я резервирую память и сшиваю как было сделано в самом первом ответе.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы имели неосторожность предложить push_back вместо insert как лучший способ обобщения и ошиблись. Это бывает.
Ошибся и признал это. Узнал что-то новое и пошел дальше.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 15:17
Цитата Сообщение от S_el Посмотреть сообщение
Ошибся и признал это. Узнал что-то новое и пошел дальше.
Всё верно. Но вы делаете суждения о том что хорошо, а что нет в части обобщений.
Цитата Сообщение от S_el Посмотреть сообщение
предпочитаю даже не пытаться создать универсальное решение там, где это не нужно
Однако мы же говорим о интерфейсах, если конкретизировать
универсальное решение
и я сказал о том, что со временем вы либо измените точку зрения либо нет. Тут я и имел ввиду, что на фразу в которой я возблагодарил создателя за то что метод insert стал обобщением и сократил количество специализаций вы рискнули сказать, что push_back универсальнее как интерфейс. А как вы можете оценить универсальность если склонны ошибаться в том, что это такое?
S_el, я не говорю, о том, что нужно писать библиотеки на каждом шагу. Но обилие хардкода в современном мэйнстриме зашкаливает. Это не только генерённый код. Это код, который пишут вполне квалифицированные программисты под давлением сроков и прессинга. Истина где-то есть, но я не стал бы искать её в этой теме, говоря об уровне абстракции для конкретного случая. Всё хорошо, когда оно хорошо.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 16:27
Цитата Сообщение от IGPIGP Посмотреть сообщение
Тут я и имел ввиду, что на фразу в которой я возблагодарил создателя за то что метод insert стал обобщением и сократил количество специализаций вы рискнули сказать, что push_back универсальнее как интерфейс.
Понимаете в чем дело insert это универсальное решение для вставки. Для добавления в конец универсальное решение должно называть либо push_back или, как уже выяснили, append. Любое более специализированное решение будет не менее эффективным более общего. Поэтому за вставку в любую позицию приходится чем-то платить. И если все что вам нужно это добавить что-то в конец использовать insert - избыточно.
Поэтому нет, я не мог сказать что push_back универсальнее чем insert и действительно не говорил это. Вот моя цитата:
Цитата Сообщение от S_el Посмотреть сообщение
я бы использовал push_back для вставки в конец, т.к. здесь только это и требуется.
конечно, намного удобнее приписать собеседнику ложный тезис и доблестно его разгромить, но давайте обойдемся без подобных приемов.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 19:26
Цитата Сообщение от S_el Посмотреть сообщение
я бы использовал push_back для вставки в конец, т.к. здесь только это и требуется.
Как выяснилось не требуется. А высказывание достаточно безапеляционно.
Цитата Сообщение от S_el Посмотреть сообщение
Понимаете в чем дело insert это универсальное решение для вставки. Для добавления в конец универсальное решение должно называть либо push_back
Может быть. Я говорил, что с терминологией и именами беда в программировании. Но на деле это не так.
Цитата Сообщение от S_el Посмотреть сообщение
Любое более специализированное решение будет не менее эффективным более общего.
Если вставлять в конец то не должно быть разницы, хотя это вопрос реализации. Кому-то же показалось, что списку не нужно хранить размер и теперь нельзя эффективно выделить место.
Это потому что кто-то решил что список не должен выделять "сладкие" сплошные куски (они-де для массивов-векторов), а списки могут и побомжевать отдельными кускочками. Зачем же это резервировать. Пусть дескать берут то, что есть на данный момент. Но у списков есть важная черта, - возможность работать с адресами (валидность итераторов после любых операций не удаляющих по этим адресам). Это пошло побоку. Люди думают за других!
Так же и accumulate не делает резервирования и если не сделать руками то код будет слабый. С insert та же проблема. Если реализовано хорошо то не должно быть разницы между пушами и вставкой. Просто пуши - синтаксический сахар использующий инсёрт максимально эффективно для данного типа контейнера. Поэтому ваши рассуждения звучат для меня странно.
А теперь такое же уверенно-категоричное суждение:
Цитата Сообщение от S_el Посмотреть сообщение
Спискам он и не нужен, весь смысл reserve в получении блока памяти
Есть ресайз. И пусть он (может выделять кусками) и называется по иному, но он инкапсулирует пачку вызовов к OS для заказа свободной памяти и их выполнение. Потом остаётся лишь писать. Это очень хорошо. Он оказался не нужен в большинстве современных бесплатных библиотек для двусвязного списка по смешной причине. Съэкономили на счётчике длины и операции его инкрементирования/декрементирования при вставке/удалении! Поэтому он есть. Но смысла в нём нет. Жаль.
Цитата Сообщение от S_el Посмотреть сообщение
конечно, намного удобнее приписать собеседнику ложный тезис и доблестно его разгромить, но давайте обойдемся без подобных приемов.
Я не соберался этого делать. Наоборот. Вы вступили в предметное обсуждение в момент когда запузырились фекалии в теме. Я был этому рад. Тем более, что всегда относился к вам с симпатией встречая в разных разделах. Неудачные суждения о посимвольном копировании и о пуш-бэке не вызвали особых эмоций. С кем не бывает? Главное, - наш общий интерес к теме. Она действительно интересна в данном контексте. Потому что найти способ собрать строки в строку не представляется проблемой и внешний контейнер вообще не при чём. Но концовка меня ошеломила:
Цитата Сообщение от S_el Посмотреть сообщение
Так я это и сам знаю. Поэтому предпочитаю даже не пытаться создать универсальное решение там, где это не нужно.
В контексте обсуждения, это значило примерно:
"Что бы собрать строку из строк не нужно так заумствовать!!"

Мой ответ значительно мягче, чем мог бы быть.

Добавлено через 27 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Поэтому он есть. Но смысла в нём нет. Жаль.
Тут я чуть перегибаю, потому, что это замедляет лишь при небольших объектах. Конечно, ресайз на списке с объектами в сотни и более байт будет занимать такое же время как и на малых объектах (плюс - минус кэш, конечно, но это трудно обсуждать), а выделение одним пулом будет гораздо быстрее.
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 20:05
Цитата Сообщение от IGPIGP Посмотреть сообщение
Как выяснилось не требуется. А высказывание достаточно безапеляционно.
Правильно. И конкретно в этом случае я ошибся, что и написал выше.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Так же и accumulate не делает резервирования и если не сделать руками то код будет слабый.
Так как accumulate это алгоритм из заголовочника numeric, т.е. основное предназначение работа с числами.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Тем более, что всегда относился к вам с симпатией встречая в разных разделах. Неудачные суждения о посимвольном копировании и о пуш-бэке не вызвали особых эмоций. С кем не бывает?
Так и я к вам с симпатией отношусь. Ну разошлись у нас взгляды на детали реализации - что с того. Лично я кое-что полезное из темы почерпнул.

Цитата Сообщение от IGPIGP Посмотреть сообщение
В контексте обсуждения, это значило примерно:
"Что бы собрать строку из строк не нужно так заумствовать!!"
Хе-хе. На самом деле нет. Когда я пишу о своих предпочтениях, это всего лишь мои предпочтения. Это не совет и не рекомендация. Ваш ответ отлично подойдет в качестве иллюстрации общего решения, но для большинства кейсов он избыточен.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 20:24
Цитата Сообщение от S_el Посмотреть сообщение
Так как accumulate это алгоритм из заголовочника numeric, т.е. основное предназначение работа с числами.
Однако можно было бы сделать общее решение и это не усложнило бы работу с числами. А теперь есть соблазн для тех кто не желает париться и вникнуть в детали. Может на java лучше писать тогда? Ведь используется перегрузка оператора сложения и это не позволит использовать резерв эффективно так как не ссылка а значение возвращается.
Цитата Сообщение от S_el Посмотреть сообщение
. Когда я пишу о своих предпочтениях, это всего лишь мои предпочтения.
Это вызвало странное чувство того, что вы вступили в диалог с негативным к коду отношением, но высказали его лишь в конце, после цепи неудачных суждений.
Цитата Сообщение от S_el Посмотреть сообщение
Ваш ответ отлично подойдет в качестве иллюстрации общего решения, но для большинства кейсов он избыточен.
Он по затратам труда не выше частного решения. Посмотрите внимательно и увидите - 10-15 строк описания алгоритма. Важно, что он широко применим и расширяем. А. Александреску сравнивает частные наколеночные решения, с магическими числами. Такие решения трудно сопровождать, понимать, и они повторяются в самых разных вариантах замусоривая и увеличивая код. Это снижает общую читаемость всего. Я начал это понимать недавно, но чем дальше тем больше.
Цитата Сообщение от S_el Посмотреть сообщение
Так и я к вам с симпатией отношусь. Ну разошлись у нас взгляды на детали реализации - что с того. Лично я кое-что полезное из темы почерпнул.
Думаю, это стоит любого (разумного) хода событий и любых (разумных) затрат энергии.
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 21:05
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако можно было бы сделать общее решение и это не усложнило бы работу с числами.
Тут вопрос как бы спроектировать общее решение сшивателя строк, что уж тут говорить про проектирование целой стандартной библиотеки такого старого языка как C++. Вот меняют кое-что потихоньку.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Это вызвало странное чувство того, что вы вступили в диалог с негативным к коду отношением, но высказали его лишь в конце, после цепи неудачных суждений.
Это не так. Если бы у меня было негативное отношение - я бы высказался более предметно(например, указал бы что вы итерируете по значению, создавая тем самым копии элементов) - наоборот я одобрил ваш ответ нажав на соотв. кнопку. Ваше решение в первую очередь ценно не общностью подхода, но демонстрацией того, что для эффективной реализации следует всегда держать в голове то, что постоянная реаллокация памяти существенно замедляет работу программы. Просто в силу того, что с этим сталкивается практически каждый программист C++. Что до моего замечания к выбранному методу то это не более чем комментарий к детали реализации, которая решается при проектировании.
Я не согласен с выбранным вами подходом исключительно из практических(скорость написания, удобство, ...), а не академических соображений, но именно это - дело вкуса. Кому-то нравятся значащие отступы (Python, F#), кто-то (например я) - такой подход терпеть не может. Кого-то раздражает что экспортируемые вещи в Go начинаются с заглавной буквы, а кто-то - восторгается таким изящным подходом. Поэтому наша дискуссия не про содержание (здесь я с вами солидарен), но исключительно про форму. Вы меня убедили что insert - грамотный выбор для решаемой вами задачи(получить краткое, но эффективное решение) и сделан из практических соображений(нет у строк перегрузки для push_back и желание получить более универсальное решение).

Цитата Сообщение от IGPIGP Посмотреть сообщение
Он по затратам труда не выше частного решения.
Для вас - да, а для начинающих программистов?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Я начал это понимать недавно, но чем дальше тем больше.
Именно поэтому практически каждый программист с опытом уже имеет набор классов, утилит, вспомогательных библиотек, ... Некоторые из них перерастают в любопытные проекты с открытым исходным кодом.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 22:26
Цитата Сообщение от S_el Посмотреть сообщение
например, указал бы что вы итерируете по значению, создавая тем самым копии элементов
Ссылка не поможет так как элемент копируется в конец суммирующего результата. Значение будет скопировано с использованием переноса и одна копия всё ровно будет.
Тут есть аналогия с тем, что многие думают, что += для строк работая по ссылке имеет дело с одной исходной строкой. А это сбывается лишь если память загодя зарезервирована. Иначе ссылка как демон, она вроде есть, ан - хвать и нету ея! (Ионан Васильевич меняет прошивку кмоп ).
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
05.05.2019, 23:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ссылка не поможет так как элемент копируется в конец суммирующего результата. Значение будет скопировано с использованием переноса и одна копия всё ровно будет.
Одна, а не две. Для малых строк заметной разницы не будет, но если объединяемые строки большие, а элементов много, то лишнее копирование сыграет свою роль.
Пример на векторах - https://ideone.com/ej4mM5
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.05.2019, 23:43
Цитата Сообщение от S_el Посмотреть сообщение
Одна, а не две.
И правда! Интересно однако. Значит что-то о константных ссылках я ещё не понимаю. Мне казалось, что компилятор видя гибель временного объекта в итерации должен включить перемещающее копирование (а для строк и пр. контейнеров, оно реализовано). Выходит, ошибался. Спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2019, 23:43
Помогаю со студенческими работами здесь

Как перебрать все элементы в map<string, vector<string>>
Доброго времени суток. Решаю следующую задачу: В файле есть сведения об автомобилях: марка автомобиля, номер и фамилия владельца. ...

Вывод элементов map <string,vector<string>>
Доброго времени суток. Как можно вывести массив map &lt;string,vector&lt;string&gt;&gt; mp ? Могу только предположить, что нужно как-то...

Перенос данных c vector<string> в vector<double>
Необходимо перенести введенные данные в vector&lt;string&gt; в vector&lt;double&gt;, я реализовал это вот так: word.push_back(a); ...

Vector and string
#include &lt;vector&gt; #include &lt;iostream&gt; using namespace std; int main(void) { vector&lt;string&gt; v(10); string st; ...

Vector в string
Какой самый удачный способ преобразовать вектор в строку?


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru