Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629

Быстрый способ создания строковой переменной из значений нескольких строковых переменных

26.12.2017, 21:52. Показов 5948. Ответов 71
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
К примеру, в javascript'e из трёх исходных строковых переменных создать одну конкатенированную рекомендуется следующим способом:
надо поместить значения исходных переменных в массив, а затем "соединить" его элементы методом join (), используя пустой разделитель ''
Эта операция y = [x1, x2, x3].join (''); выполнится много быстрее, чем последовательная конкатенация трёх значений в одну переменную

А как с этим обстоит дело в C++ ?
Имеется ли в нём аналог метода join () и имеет ли вообще смысл этим заморачиваться?

Извиняюсь за ламерский вопрос, но этот раздел вроде как для таких вопросов и предназначен, так?

PS. спрашивал об этом же у "явщика", тот ответил, что для работы со строками у него есть класс "стринг-билдер", который всё это вполне эффективно делает, а как именно - ему совсем неинтересно
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2017, 21:52
Ответы с готовыми решениями:

Проверка значений нескольких строковых переменных
Подскажите пожалуйста как мне проще проверить несколько переменных, на наличие в них значений. Если хоть одна из них будет пуста, вылазит...

Извлечение числовых значений из строковых переменных
Добрый день! Имею одномерный массив построково. Пример. configure xdsl line 1/1/9/42 service-profile 56 spectrum-profile 14 admin-up...

Как при выборе элемента Листбокса изменить значения нескольких строковых переменных
Например у меня есть листбох с таким соддержанием http://test.ru/ http://test2.ru/ http://test3.ru/ Я выбрал первый то string...

71
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.12.2017, 11:27
Студворк — интернет-сервис помощи студентам
avgoor, да это видимо подбор пароля к чему-то. А обсуждение взлома ПО на данном форуме вообще-то запрещено
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 12:21  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
да это видимо подбор пароля к чему-то. А обсуждение взлома ПО на данном форуме вообще-то запрещено
глубокая мысль
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2017, 20:06
Господа. Я не знаю Java, но слышал, что объекты в нём это ссылки. Также как в C#. Я не говорю о простых встроенных типах, а имею ввиду именно объекты. Строки, это где то там. Но принципиальная разница строки C++ и Java в этом свете, состоит в том, что строка С++, несмотря на то, что она создаётся в куче, всё же поддерживает семантику значения. Это значит, что локальная строка возвращаемая по ссылке, это авария. То есть, я о том, что создать класс который соединяет строки используя указатели, без копирования не получится, не нарушая модель владения. Можно получить часть строки по ссылке из-вне, а часть создать в функции, например. Но их нельзя будет сцепить и вернуть.
В Jave все объекты - ссылки на кучу и они не мрут пока есть живая ссылка. Это медленно само-по себе и это сборщик хлама (что тоже медленно), но там в принципе нет головняка с жизненным циклом/владением и пр. и бр... То есть, мне кажется нельзя сравнивать и близко.
Не знаю, понятно ли я говорю и говорю ли о деле (может не выспался просто).
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.12.2017, 20:18
IGPIGP, лет 8 назад я точно так же радовался простоте выделения памяти в Java, по сравнению с С. Но со временем оказалось, что освобождать память от "висячих указателей" ничуть не проще, чем изначальная работа жизненным циклом и тем более с опосредованным управлением выделения памяти в контейнерах STL.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2017, 20:38
Цитата Сообщение от TRam_ Посмотреть сообщение
IGPIGP, лет 8 назад я точно так же радовался простоте выделения памяти в Java, по сравнению с С. Но со временем оказалось, что освобождать память от "висячих указателей" ничуть не проще, чем изначальная работа жизненным циклом и тем более с опосредованным управлением выделения памяти в контейнерах STL.
Совершенно согласен. Я не о том, что там лучше. Там просто иначе всё. А по настоящему хорошо там, где нас нет. Меня уж точно. То есть, в плюсах.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 21:19  [ТС]
вообще-то я писал о Javascript'e (а Java и Javascript -- это "две большие разницы", и не только в Одессе)

могу дать ссылку на страницу с онлайн-демонстрацией работы программы, которая полностью реализует озвученную задачу, только вот не знаю -- поможет ли, ведь код там на Javascript'e, о котором, как я понял, у вас весьма смутное представление (примерно такое же, как у меня о C++ и о Jave)

Для начала скажу следующее: в Javascript'e спокойно можно работать с массивом, имеющим, например, такие начальные значения [3.1415926, "string", ['a','b', 'c', d']], и в котором в любой момент может измениться тип данных любого элемента, т. е. из [число, строка, строковый массив] вполне может получиться [числовой массив, число, строка] и подобные преобразования возможны любое количество раз
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2017, 21:23
Цитата Сообщение от kalabuni Посмотреть сообщение
вообще-то я писал о Javascript'e (а Java и Javascript -- это "две большие разницы"
Это не суть важно.
Цитата Сообщение от kalabuni Посмотреть сообщение
и не только в Одессе
Рад что, Вы помните.
Но говорил я о С++ и его RAII. Тут нет тех ссылок которые позволяют сливать несколько строк не интересуясь их природой в смысле жизненного цикла. Тут ссылки и значения - это мухи и котлеты. В книге "Язык программирования С++" сп. издание, Бином, Москва, 2002.
в главе 11.12 (стр.341) Класс String, Бьярне (наш) Страуструп описывает подход основанный на идиоме "разделяемое представление". Фактически данный подход связан с подсчётом ссылок, кстати. Он позволяет в некоторой степени сократить копирование. Это всё что я могу добавить. Из Одессы, - таки-да.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 21:32  [ТС]
по C++ недавно подарили букинистическое издание "Как программировать на Си++" от семейства Дейтелов (Х.М. и П. Дж.), М., Бином, 1998, не знаю уж, какого оно качества, отзывы в сети пока не смотрел
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.12.2017, 21:58
Цитата Сообщение от kalabuni Посмотреть сообщение
"Как программировать на Си++" от семейства Дейтелов
Я слышал хорошие отзывы.
А о классе String из указанной книги сказал потому, что там просто и красиво показан подход позволяющий осуществлять совместное владение.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.12.2017, 00:46
http://cpp.sh/5e3oi - копирование строк не используется, чистая арифметика с индексами.
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
28.12.2017, 04:02
Вопрос - как склеить, задача - как разодрать...
Цитата Сообщение от TRam_ Посмотреть сообщение
копирование строк не используется, чистая арифметика с индексами.
А может вообще не с того начали?
Если из С взять char[] и тыкать указателем куда следует?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
28.12.2017, 04:35  [ТС]
TRam_, благодарю за потраченное время
но, извините, вообще не понял про "копирование строк" -- что вы подразумеваете под этой (отсутствующей у вас в коде) процедурой?

и ещё вопросы: 1) ресурс, на котором вы разместили код, на здешнем сленге называется "песочницей", или как-то иначе?
и 2) можно ли на этом ресурсе "обкатать" какой-то код, который, к примеру, брал бы исходную строку из файла, и результат тоже выводил бы в файл именно с точки зрения проверки работы кода процедур (функций) языка, обеспечивающих взаимодействие программы с файловой системой компьютера?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.12.2017, 04:44
Цитата Сообщение от kalabuni Посмотреть сообщение
ы подразумеваете под этой (отсутствующей у вас в коде) процедурой?
Подразумевал вот эти ваши слова -
Цитата Сообщение от kalabuni Посмотреть сообщение
у меня уже окончательно имеется элемент AB 2-хсимвольного массива (назову таковые дабл-элементами), и именно на этом шаге я использую этот дабл-элемент как первую часть вновь создаваемого трипл-элемента ABC,
В данном же коде каждый символ один раз записывается во все-все строки, в которые он входит. И промежуточного копирования между строками тут нет.

Цитата Сообщение от Herji Посмотреть сообщение
Если из С взять char[] и тыкать указателем куда следует?
Особой разницы в производительности с
C++
1
arr[j][k] += s[i];
не будет. Потому что "под капотом" данной записи и есть копирование значения char из одного массива в другой + инкрементация переменной "размер второго массива". Перевыделения памяти под строку тут не происходит, т.к. память всем строкам была полностью выделена в первом цикле. Ну разве что дополнительное сравнение будет, выделенной длины и переменной с размером.

Цитата Сообщение от kalabuni Посмотреть сообщение
можно ли на этом ресурсе "обкатать" какой-то код
Именно на этом - нет. Но возможно есть другие, допускающие загрузку файла.

P.S. советую всё же поставить компилятор и IDE, т.к. без пошаговой отладки будет сложно разбираться в некоторых моментах. В данном конкретном случае использовал онлайн-компилятор просто для демонстрации работы кода, отлаживал же под visual studio.
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
28.12.2017, 04:56
Цитата Сообщение от TRam_ Посмотреть сообщение
C++
1
arr[j][k] += s[i];
я имел в виду что с единым массивом символов ничего складывать-то и создавать вообще не нужно, как бы можно и без этого обойтись
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
28.12.2017, 08:52  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
В данном же коде каждый символ один раз записывается во все-все строки, в которые он входит. И промежуточного копирования между строками тут нет.
теперь понятно...
вы как-то оригинально поняли моё описание моего алгоритма (виноват в этом явно я -- плохо описал, значит), и назвали его "копированием строк"

ну тогда я ваш алгоритм тоже "обзову", уж извините... у вас -- нерациональное "клонирование символов исходной строки"

я "строю" подстроку из 2-х символов, заношу её в искомый массив, затем "достраиваю" эту уже готовую (и нужную для вывода) подстроку ещё одним символом, и получаю подстроку из 3-х символов, затем добавляю ещё один символ, и получаю четырёхсимвольную подстроку.

вы же параллельно "строите" все подстроки одновременно -- символов-"кирпичиков" и действий вам требуется много больше, чем мне

PS. тут выше прозвучала креативная мысль о том, что это нужно якобы для взлома ПО
поясняю -- это частный случай обычной лингвистической задачи -- "нахождение всех фраз / словосочетаний в предложении", просто "слова" здесь -- одиночные символы, и разделителей вовсе нет
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.12.2017, 08:59
Цитата Сообщение от TRam_ Посмотреть сообщение
http://cpp.sh/5e3oi - копирование строк не используется, чистая арифметика с индексами.
TRam_, всё просто. Просто Вы и близко не поняли о чём я говорю. Я говорю о владении, времени жизни и RAII в конечном счёте.
Б (Бог). Страуструп провозгласил, что тот кто истинно поверит в то что
Resource Acquisition это таки Initialization
имеет шанс попасть в RAII ещё до смерти.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
using namespace std;
string& foo(){
string ub="crash";//c:\users\host\documents\visual studio 2008\...\slava.cpp(39988) : warning C4172: возвращение адреса локальной или временной переменной
return ub;
}
string & summ(string & firstStr){
string ub="crash";
return firstStr+=ub;
//return ub+=firstStr;//а это плохо
}
int main(int argc, char* argv[])
{
//cout << foo() << endl;//весело?
string firstStr = "non ub";
cout<<summ( firstStr)<<endl;
cout<<endl;
system("pause");
return 0;
}
Цитата Сообщение от Herji Посмотреть сообщение
Если из С взять char[] и тыкать указателем куда следует?
у нативных указателей вообще нет понятия о владении. Им всё равно на что указывать. У перегруженного оператора сложения нет и не может быть инфы о времени жизни слагаемых. Если передать указатели на автоматические переменные и вернуть указатель на результат за пределы области он не сможет этого проконтролировать. В моём фрагменте об этом как раз.
Цитата Сообщение от kalabuni Посмотреть сообщение
можно ли на этом ресурсе "обкатать" какой-то код
На ресурсе можно, а в разделе, - вряд ли. Если код нужен промышленного качества.
Цитата Сообщение от kalabuni Посмотреть сообщение
брал бы исходную строку из файла, и результат тоже выводил бы в файл...
в плюсах можно сделать и то, что можно и то, что нельзя. Но нужно обсуждать и делать.
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
28.12.2017, 10:57
Цитата Сообщение от IGPIGP Посмотреть сообщение
о владении, времени жизни и RAII
, если создать char[] в куче и туда тыкать указателями, проблема решится?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
28.12.2017, 12:14
Цитата Сообщение от kalabuni Посмотреть сообщение
"достраиваю" эту уже готовую (и нужную для вывода) подстроку ещё одним символом, и получаю подстроку из 3-х символов, затем добавляю ещё один символ, и получаю четырёхсимвольную подстроку.
Вот в С++ "достраивание" с перевыделением памяти из-за увеличившейся длины строки - самая затратная операция. Это конечно можно обойти, зарезервировав место для символов заранее, и вместо присваивания подстроки производить её добавление (к свежеинициализированной пустой строке, в которой выделено место под все входящие в неё символы).

А так, если рассматривать именно различие "копирование по одному" vs "копирование готовыми кусками", то собственно данных будет скопировано ровно точно такое же количество (т.к. суммарное число символов во всех полученных строках что 1ым способом, что 2ым способом останется одинаковым). Отличия будут в проверках выделенности памяти для очередного копирования, но тут "абсолютного преимущества" у сложения коротких строк нет - потому что проверки "поместится-не поместится с учётом длины первой строки и длины второй".

А вот в Java наоборот, там 10 операций добавления символа будут в 5-10 раз дольше, чем одна операция добавления подстроки с 10ю символами. И там действительно работа с подстроками имеет смысл.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
29.12.2017, 08:52  [ТС]
Лучший ответ Сообщение было отмечено Kuzia domovenok как решение

Решение

TRam_,
Code
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
28
29
S = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
     2$      3$      4$          5$
        +----+  +-----+ +------+    +-------+
 0  | AB |  | ABC | | ABCD |    | ABCDE |
 1  | BC |  | BCD | | BCDE |    | BCDEF |
 2  | CD |  | CDE | | CDEF |    | CDEFG |
 3  | DE |  | DEF | | DEFG |    | DEFGH |
 4  | EF |  | EFG | | EFGH |    | EFGHI |
 5  | FG |  | FGH | | FGHI |    | FGHIJ |
 6  | GH |  | GHI | | GHIJ |    | GHIJK |
 7  | HI |  | HIJ | | HIJK |    | HIJKL |
 8  | IJ |  | IJK | | IJKL |    | IJKLM |
 9  | JK |  | JKL | | JKLM |    | JKLMN |
10  | KL |  | KLM | | KLMN |    | KLMNO |
11  | LM |  | LMN | | LMNO |    | LMNOP |
12  | MN |  | MNO | | MNOP |    | MNOPQ |
13  | NO |  | NOP | | NOPQ |    | NOPQR |
14  | OP |  | OPQ | | OPQR |    | OPQRS |
15  | PQ |  | PQR | | PQRS |    | PQRST |
16  | QR |  | QRS | | QRST |    | QRSTU |
17  | RS |  | RST | | RSTU |    | RSTUV |
18  | ST |  | STU | | STUV |    | STUVW |
19  | TU |  | TUV | | TUVW |    | TUVWX |
20  | UV |  | UVW | | UVWX |    | UVWXY |
21  | VW |  | VWX | | VWXY |    | VWXYZ |
22  | WX |  | WXY | | WXYZ |    +-------+
23  | XY |  | XYZ | +------+
24  | YZ |  +-----+
потратил сегодня некоторое время, написал на системном javascript'e программку, работающую по вашему алгоритму, т.е такую, которая формирует все требуемые массивы одновременно, клонируя в них символы исходной строки и много-много лишних раз их конкатенируя
покрутил эту программку 50 раз, всякий раз меняя и количество формируемых массивов, и длину исходной строки, и её символы на рандомные значения, и сохранял время формирования массивов (не учитывая время на вывод результата в текстовой файл -- это совсем другая задача)
затем при тех же условиях прокрутил 50 раз программу, работающую по моему алгоритму (который последовательно из массива 2$ делает массив 3$, а из него -- 4$ и т. д. )
в итоге: на javascript'e мой алгоритм в среднем работает почти в 6 раз быстрее вашего
Так что, хоть убейте, но просто не могу поверить, что Cи++ в работе со строками настолько (!!!) отличается от прочих языков программирования, что для достижения эффективного результата в нём необходимо менять нормальную логику на какую-то "плюсанутую"
0
 Аватар для bedvit
1210 / 261 / 22
Регистрация: 20.05.2016
Сообщений: 1,147
Записей в блоге: 22
29.12.2017, 15:09
С++ и javascript: Они изначально в разных весовых категориях (компилируемый язык со статической типизацией против интерпретируемого языка с динамической). По алгоритмам не скажу, если будут на С++ - могу потестировать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2017, 15:09

Вывод разных значений одной строковой переменной
вообщем кароче написал я написал такой кодик: var s1 = &quot;image&quot;; s1 = &quot;images&quot;; Console.WriteLine(s1); ...

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

Получить значение переменной из потока без создания глобальных переменных
void __fastcall Pars::Execute() { Synchronize(&amp;UpdateCaption); } ...

Вывод значений нескольких переменных
Добрый день. Подскажите, пожалуйста, как мне вывести с этого простенького цикла не только значение k, но и сгенерированное значение...

Ввод нескольких значений переменных
Здравствуйте.Помогите пожалуйста доработать программу.Нужно сделать, чтобы по каждой переменной можно было вводить несколько значений (1000...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru