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

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

26.12.2017, 21:52. Показов 5965. Ответов 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, 01:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kalabuni Посмотреть сообщение
циклом по символам строки необходимо создать несколько массивов
Максимальное число символов в одном слове примерно известно? Разделитель - пробел? Может быть тут нужен массив массивов строк?

Добавлено через 3 минуты
Цитата Сообщение от kalabuni Посмотреть сообщение
'AB'
В С++ строки обозначаются только с двойными кавычками. С одинарными - только одиночные символы.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 01:49  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
unordered_set + substr
нельзя заглядывать ни вперёд, ни назад по строке, доступ последовательный, на каждом шаге i цикла обрабатываем только символ s [i], ни s [i -1], ни s [i +1] задействовать нельзя, соответственно никаких substr тоже использовать нельзя
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.12.2017, 01:50
Цитата Сообщение от kalabuni Посмотреть сообщение
во втором массиве a3
массивы должны сохраняться, или после обработки всей той строки снова слиться в строки соответсвенно a2, a3, a4 и т.д.?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 01:54  [ТС]
массивы подстрок из 2-х, 3-х и т. д. символов должны сохраниться после прохода по строке (после выхода из цикла)
и ещё -- строка после окончания работы цикла более будет вовсе недоступна (она "одноразовая")
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 01:57
kalabuni, Сколько различных длин подстрок нужно и каких?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 02:11  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Максимальное число символов в одном слове примерно известно? Разделитель - пробел?
я ни про "слова", ни про "разделитель" вообще ничего не писал, вы о какой-то другой задаче сейчас пишете, совсем не о моей

Добавлено через 3 минуты
Цитата Сообщение от avgoor Посмотреть сообщение
kalabuni, Сколько различных длин подстрок нужно и каких?
в условии всё написано
несколько массивов, клиент будет выбирать - галочки поставит:
"от двух до четырёх", "от двух до пяти", "от двух до семидесяти"... всегда известен только нижний предел - константа 2
мне не нужна от вас реализация на си++
мне нужно понять -- как описать алгоритм для реализации этой задачи на си++

Добавлено через 6 минут
на javascript'e эту задачу я уже решил, показал описание алгоритма и демонстрацию работы программисту-сишнику, чтобы он переложил это на си++, он впал в ступор... вот я к вам и обращаюсь за помощью
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.12.2017, 02:20
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <string>
#include <vector>
 
 
int main()
{ 
    std::string s = "AB CDEF GH I JKLMNO PQRSTUV WX YZ   ";
 
    std::vector< std::vector<std::string> > arr;
 
    arr.resize(3);          // предарительно выделяем массивы со строками от 2 до 4 символов
    int approx_count = 5;       // число строк в каждом массиве предварительно выделенное
 
 
    for(std::size_t i = 0; i < arr.size(); i++)
        arr[i].reserve(approx_count);              // теоретически тут можно вставить арифм. прогрессию или нормальное распределение
 
 
    std::string temp;
    temp.reserve(3);    // предполагаемая длина самого длинного слова
 
 
    for(std::size_t i = 0; i < s.size(); i++)
    {
        if(s[i] == ' ')
        {
            if(temp.size() >= 2) 
            {
                std::size_t str_arr_num = temp.size() - 2;
 
                if(str_arr_num >= arr.size())  // длина слова больше, чем ожидалась
                {
                    std::size_t old_size = arr.size();
                    arr.resize(str_arr_num + 1);       // увеличиваем количество массивов
 
                    for(std::size_t i = old_size; i < arr.size(); i++)   // резервируем под будущие строки
                        arr[i].reserve(approx_count);               // опять же можно сделать убывание по нормальному распределению
                }
                arr[str_arr_num].push_back(temp);
            }
            temp.resize(0);
        }
        else
            temp += s[i];
    }
 
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 02:22
kalabuni,
Во первых нужен вектор который содержит unordered_setы.
Потом
1) Можно взять промежуточную строку, длиной, совпадающей с максимальной подстрокой и инсертить в сеты подстроки этой подстроки (с конца). На каждом вводе символа push_back, если размер превышает максимальный убирать нулевой символ (это плохо с т.з. быстроты).

2) Можно ускорить взять столько стрингов - сколько нужно подстрок. Добиться заполнения их лесенкой. На каждом символе добавлять символ в конец каждого и инсертить в соответствующий сет. Если размер максимальный стирать строку. Это плохо с т.з. памяти

Можно сделать кольцевой буфер. Если сделать его двойной длины (с повторением данных), опять же substr.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 02:22
Дубль.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.12.2017, 02:39
Обращаться к строкам как в arr[i][j]

Добавлено через 10 минут
Хоть мой способ значительно медленнее чем предлагает avgoor, но самый просто реализуемый. Для быстрых способов исходную строку либо её копию сохранять таки надо, а массивы делать не массивами строк, а массивами указателей на первые буквы слов в исходной строке.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 02:42  [ТС]
Цитата Сообщение от TRam_ Посмотреть сообщение
Для быстрых способов исходную строку либо её копию сохранять таки надо, а массивы делать не массивами строк, а массивами указателей на первые буквы слов в исходной строке.
условия задачи я менять не вправе -- нужно создать именно такие массивы, как я описал выше

и о каких-таких "словах" вы всё пишете уже не в первый раз?
я оперирую понятиями "строка" и "подстрока" (часть этой самой "строки")
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 02:46
Цитата Сообщение от TRam_ Посмотреть сообщение
а массивами указателей на первые буквы слов в исходной строке
В 17 стандарт завезли std::string_view, это почти оно, только еще конец хранит.
Цитата Сообщение от TRam_ Посмотреть сообщение
Хоть мой способ значительно медленнее
При медленном алгоритме оптимизировать отдельные операции (в данном случае конкатенацию) - мартышкин труд. В первую очередь надо оптимизировать алгоритм.

Добавлено через 1 минуту
Цитата Сообщение от kalabuni Посмотреть сообщение
нужно создать именно такие массивы, как я описал выше
но никто не говорил, что других создавать нельзя.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 02:53  [ТС]
разумеется, искомые массивы для удобства к ним обращения в процессе работы программы сведены в один массив массивов
в a [2] хранится массив всех 2-хсимвольных подстрок,
в a [3] -- массив всех 3-хсимвольных
и т.д.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 02:58
kalabuni, операция поиска в массиве - дорогая (n). Операция поиска в отсортированном массиве - дешевле (log n) зато дорогой получается операция вставки. Если вы используете для хранения промежуточных результатов массивы (и ищете на каждой итерации, есть ли в них уже искомая строка) - попытка оптимизировать строковые операции - это экономия на спичках.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.12.2017, 03:20
Возможно теперь правильно понял что требуется:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <string>
#include <vector>
 
 
int main()
{ 
    std::string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ...";
 
    int n;
 
    std::cout << "Inpunt number of arrays > ";
    std::cin >> n;
    std::cin.get();
 
 
    std::vector< std::vector<std::string> > arr(n);
    std::vector< std::size_t > counters(n);
 
 
 
    std::size_t str_len = s.size();
 
    for(std::size_t i = 0; i < arr.size(); i++)
    {
        arr[i].resize(str_len / (i + 2) + 1 );
 
        for(std::size_t j = 0; j < arr[i].size(); j++)
            arr[i][j].reserve(i + 2);
    }
 
 
    for(std::size_t i = 0; i < s.size(); i++)
    {
        for(std::size_t j = 0; j < n; j++)
        {
            arr[j][counters[j]] += s[i];
 
            if(arr[j][counters[j]].size() >= (j+2))
                ++counters[j];
        }
    }
 
    for(std::size_t i = 0; i < arr.size(); i++)
    {
        if(arr[i][counters[i]].size() < (i+2))  // то удаляем последний недозаполненный элемент
        {
            arr[i].pop_back();
            --counters[i];
        }
    }
 
 
    for(std::size_t i = 0; i < arr.size(); i++)
    {
        for(std::size_t j = 0; j <= counters[i]; j++)
            std::cout << arr[i][j] << " ";
 
        std::cout << std::endl;
    }
 
    std::cin.get();
}
http://cpp.sh/67fkg
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 03:23
TRam_, Выводит АB CD .... А где BC?
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 03:25  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
операция поиска в массиве - дорогая (n). Операция поиска в отсортированном массиве - дешевле (log n)
я вообще ничего не ищу, я просто последовательно перебираю строку, на каждом шаге перебора создавая несколько элементов искомых массивов
на шаге, когда я прочитываю символ C, у меня уже окончательно имеется элемент AB 2-хсимвольного массива (назову таковые дабл-элементами),
и именно на этом шаге я использую этот дабл-элемент как первую часть вновь создаваемого трипл-элемента ABC,
затем создаю новый дабл-элемент BC, который на следующем шаге используется как первая часть трипл-элемента BCD
и так далее
и всякий раз (n-1)-элемент используется для создания n-элемента
имхо, всё же просто и логично, разве нет?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 03:52
kalabuni, в достаточно длинной строке подстрока, например, "AB" встретится много раз. Вы уверены, что в массиве подстрок она тоже должна встречаться много раз? Обычно, в таких заданиях требуют однократного вывода. Приведите полный текст задачи.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 03:59  [ТС]
Цитата Сообщение от avgoor Посмотреть сообщение
в достаточно длинной строке подстрока, например, "AB" встретится много раз. Вы уверены, что в массиве подстрок она тоже должна встречаться много раз? Обычно, в таких заданиях требуют однократного вывода. Приведите полный текст задачи.
уверен, полный текст задачи уже приведён
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.12.2017, 04:05
kalabuni, а мне покзалось что вы написали "суть задачи" а не полный текст. Откуда эта задача?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2017, 04:05

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru