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

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

26.12.2017, 21:52. Показов 5657. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
Модель здравоохранения 12. добавление болезней через ресурпул, как аварии
anaschu 22.05.2026
Болезни — это ключевая часть нашей модели. Нам нужно, чтобы работник периодически уходил на больничный, его задание при этом зависало, а после выздоровления работа возобновлялась. Реализуем это двумя. . .
Модель здравоохранения 11. Создаём классы Задание и Работник
anaschu 22.05.2026
В AnyLogic каждая заявка и каждый ресурс — это объект определённого класса. Нам нужно создать два класса: Задание (заявка) и Работник (ресурс). Класс Задание В дереве проекта нажимаем правой. . .
Модель здравоохранения 10. Новая модель, смотрим, как добавлять логические блоки, и что писать внутри
anaschu 22.05.2026
Открываем AnyLogic, создаём новый проект. В дереве проекта появляется класс Main — это главный агент, в котором будет жить вся наша логика. Палитра блоков Слева находится палитра. Нас интересует. . .
модель ЗдравоСохранения 9. Новая модель, разбираемся, как ее создавать
anaschu 22.05.2026
В этой серии постов мы построим модель небольшого рабочего коллектива. Сотрудники получают задания, выполняют их, иногда болеют — и мы хотим посчитать, сколько это стоит компании. Метод. . .
[golang] Linked list
alhaos 22.05.2026
Связный список / Linked list Связный список структура данных позволяющая хранить список значений, в отличии от массива в памяти хранится не сплошным куском, а отдельными частями которые ссылаются. . .
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru