С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/55: Рейтинг темы: голосов - 55, средняя оценка - 4.95
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,273
1

Что такое std::string

30.10.2019, 21:59. Показов 10067. Ответов 68
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
int main(){
 
std::string s;
std::string st="it string";
for(int i=0; i<9; ++i){s[i]=st[i];};
 
 
std::cout << s;
 
}

скажите пожалуйста , что сейчас находится в s?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2019, 21:59
Ответы с готовыми решениями:

Что такое std::string()
И скал в гугле- там ничего понимаемого. Начну, что я вообще в символьных не шарю. Обьясните...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’
private: std::string firstName; }; std::string ClientData::getFirstName() const{ ...

что такое std::out
люди, в общем препод нам попался из разряда &quot;пришел унизился ушел&quot; ты ему слово, он тебе в ответ...

68
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,273
01.11.2019, 17:32  [ТС] 21
Author24 — интернет-сервис помощи студентам
когда в С++ я делаю вот так
C++
1
2
3
4
5
6
7
int main(){
std::string st="hi my Linux";
std::string s;
s=st;// я что перепресваиваю объекты класса string?
 
 
}
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.11.2019, 18:00 22
Цитата Сообщение от pcmax Посмотреть сообщение
s=st;// я что перепресваиваю объекты класса string?
У тебя есть код реализации std::string. У тебя есть тот же отладчик. Почему ты этим не пользуешься, чтобы ответить себе на этот вопрос? Код basic_string, это не boost spirit, в нем не так сложно разобраться. В чем твоя проблема?
1
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.11.2019, 18:05 23
Цитата Сообщение от Vourhey Посмотреть сообщение
В чем твоя проблема?
Vourhey, глядя в последний вопрос видно, что нет понятий о инициализации и присваивании. А ранее выяснилось, что нет понятия о с-строках и std::string. То есть, не будет толку от просмотра текстов стандартной библиотеки.
0
Вездепух
Эксперт CЭксперт С++
12793 / 6670 / 1795
Регистрация: 18.10.2014
Сообщений: 16,889
01.11.2019, 19:19 24
Цитата Сообщение от pcmax Посмотреть сообщение
когда в С++ я делаю вот так
C++
1
2
3
4
5
int main(){
std::string st="hi my Linux";
std::string s;
s=st;// я что перепресваиваю объекты класса string?
}
Почему "пере-"? Вы просто присваиваете объекты класса std::string.
2
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,273
02.11.2019, 13:33  [ТС] 25
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Почему "пере-"? Вы просто присваиваете объекты класса

и что происходит потом? почему я не могу прочитать после этого с присвоенного объекта, как с того объекта ,который присвоил?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
02.11.2019, 13:45 26
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
почему я не могу прочитать после этого с присвоенного объекта, как с того объекта ,который присвоил?
все ты можешь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
{
    std::string s1 {"X"}, s2;
    s2 = s1;
 
    std::cout << s2 << s1;
 
    return 0;
}
2
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 14:01 27
_stanislav, си-строки смешаны со стандартными. Инициализация с присвоением. А оно и в реализации небезопасно, кстати. То есть, требует осторожности, так как массив и с-строка не отличимы по типу. Только формат (ноль-терминатор) их отличает)
C++
1
2
3
4
5
6
7
string std_str;
    std_str="kaka";
    cout<<std_str<<endl;
    char mina[4]={'m','i','n','a'};//инициализация
   //mina="mina";//присвоение
    std_str=mina;//будет бабах
     cout<<std_str<<endl;//бабах!
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
02.11.2019, 14:09 28
Цитата Сообщение от IGPIGP Посмотреть сообщение
си-строки смешаны со стандартными
где смешаны?

Добавлено через 4 минуты
IGPIGP, так и не нужно в std::string засовывать символьный массив без терминатора, ТСу это зачем, у него в коде литерал нультерминированный.
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 16:33 29
Цитата Сообщение от _stanislav Посмотреть сообщение
IGPIGP, так и не нужно в std::string засовывать символьный массив без терминатора
Я не о том. Оно не нужно, конечно. Я о том, что контроль типов не отличает массивы с нулём и без (тип то один) и присваивание компилируется. Это по сути дыра, где ответственность на программере. Но наследие есть наследие. Я о том, что присвоение и инициализация это разные вещи. А вопросов по связанных с с-строками можно задать и в контексте работы с стандартными не мало. А нужно начать по порядку. Сначала уяснить что есть присвоение, а что - инициализация. А потом уже приведения типа при копировании и приравнивании. И точно отличать разные виды строк нужно, тоже. А пока нет этого нет смысла объяснять.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
02.11.2019, 16:50 30
Цитата Сообщение от pcmax Посмотреть сообщение
Что такое std::string
std::string это структура данных (typedef basic_string<char> string), Мейерс в STL говорил вроде бы, что в некоторых случаях, я пока не дочитал в каких, вместо basic_string<char>, лучше использовать std::vector<char>.
1
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
02.11.2019, 16:54 31
_stanislav, когда не нужен принудительный завершающий ноль, то вместо std::string лучше использовать std::vector<char>

но вообще, не могу придумать случая, когда это может помешать. Разве что тот случай, когда аргумент функции имеет именно тип std::vector<char>
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
02.11.2019, 17:01 32
Цитата Сообщение от Алексей1153 Посмотреть сообщение
когда не нужен принудительный завершающий ноль
думаю что ноль не единственная причина.
0
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
02.11.2019, 17:03 33
_stanislav, возможно, но я только одну причину смог придумать - в предыдущем посте. Если контейнер используется как массив, то разницы нет, есть ли там ноль после гарантированного заявленного количества элементов
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
02.11.2019, 17:37 34
Цитата Сообщение от _stanislav Посмотреть сообщение
Мейерс в STL говорил вроде бы, что в некоторых случаях, я пока не дочитал в каких, вместо basic_string<char>, лучше использовать std::vector<char>.
Алексей1153, читанул Мейерса, короче, цитата:

Если доступная реализация string построена на подсчете ссылок, а ее использование в
многопоточной среде порождает проблемы с быстродействием, возможны по крайней мере
три разумных варианта, ни один из которых не связан с отказом от STL. Во-первых,
проверьте, не позволяет ли реализация библиотеки отключить подсчет ссылок (обычно это
делается изменением значения препроцессорной переменной). Конечно, переносимость при
этом теряется, но с учетом минимального объема работы данный вариант все же стоит
рассмотреть. Во-вторых, найдите или создайте альтернативную реализацию string (хотя бы
частичную), не использующую подсчета ссылок. В-третьих, посмотрите, нельзя ли
использовать vector<char> вместо string. Реализации vector не могут использовать подсчет
ссылок, поэтому скрытые проблемы многопоточного быстродействия им не присущи.
Конечно, при переходе к vector<char> теряются многие удобные функции контейнера string,
но большая часть их функциональности доступна через алгоритмы STL, поэтому речь идет
не столько о сужении возможностей, сколько о смене синтаксиса.

1
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
02.11.2019, 17:56 35
_stanislav, кстати, я вот щас задумался. При многопоточности я обычно использую CString (MFC) или QString (Qt) - они юзают COW . Переменные я, конечно, синхронизирую, только сейчас что-то не пойму, почему не поломалось ничего из-за COW. А ведь ни разу не поломалось, всё чётко, проектов много, потоков в них много. Я понимаю, что магии не бывает )) Видимо, подсчёт ссылок у них внутри синхронизирован
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 18:10 36
Цитата Сообщение от Алексей1153 Посмотреть сообщение
А ведь ни разу не поломалось, всё чётко
Алексей1153 речь не о краше, а о снижении скорости. Каждая блокировка должна блокировать множество строк, если они представлены разделяемо (если речь об этом). Это моё предположение.
0
Неэпический
18109 / 10696 / 2062
Регистрация: 27.09.2012
Сообщений: 26,939
Записей в блоге: 1
02.11.2019, 18:28 37
Цитата Сообщение от _stanislav Посмотреть сообщение
Если доступная реализация string построена на подсчете ссылок
Книжка не учитывает современные версии C++?
0
Вездепух
Эксперт CЭксперт С++
12793 / 6670 / 1795
Регистрация: 18.10.2014
Сообщений: 16,889
02.11.2019, 19:18 38
Цитата Сообщение от pcmax Посмотреть сообщение
почему я не могу прочитать после этого с присвоенного объекта, как с того объекта ,который присвоил?
Не знаю, почему. Это уже у вас надо спрашивать, почему вы не можете.

Все прекрасно читается. Никаких проблем.
0
фрилансер
5848 / 5379 / 1103
Регистрация: 11.10.2019
Сообщений: 14,380
02.11.2019, 19:19 39
IGPIGP, ну, блокировка заметных тормозов не привнесёт, строка быстро скопируется и всё. У меня не было таких трафиков между потоками, чтобы заметить такие задержки. Но само копирование вне синхронизации, видимо, синхронизируется внутри класса. разработчики должны были учесть многопоточность
0
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
02.11.2019, 19:25 40
Цитата Сообщение от Алексей1153 Посмотреть сообщение
IGPIGP, ну, блокировка заметных тормозов не привнесёт, строка быстро скопируется и всё.
Если внутренне строка это кучка других строк которые хранятся по счётчикам своих ссылок (разделяемое представление строк), то трудно сказать сколько объектов будут блокировать (методами конечно) работу с одним экземпляром внешнего представления) Тут предположения - скользкая вещь.
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Но само копирование вне синхронизации, видимо, синхронизируется внутри класса. разработчики должны были учесть многопоточность
Зачем за это платить в одном потоке? Не знаю. Вообще, разговоры о реализации (и её настраиваемых вариантах) это далеко от ТС.
0
02.11.2019, 19:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2019, 19:25
Помогаю со студенческими работами здесь

Что такое std::allocator<T> ?
я так понял возвращает адрес чего то?

std::map что такое и с чем это есть
попытался найти док-ию по map, но так и не нащёл. есть у кого ли нормальная док-ия по Map?

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же...

Что означает std::string to_string( int value )?
Что означает: std::string to_string( int value )


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru