Форум программистов, компьютерный форум CyberForum.ru

Могут ли две string разделять одни данные? - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.02.2014, 13:31     Могут ли две string разделять одни данные? #1
Обнаружил, что substr() создает новую подстроку из заданной строки, а значит в данном коде:
C++
1
2
string str("something");
string a = str.substr(0), b = str.substr(4);
у меня будет три разных строки и изменения в первой не дадут никаких изменений для других. Можно расшарить в отдельных объект string уже использующуюся строку или её подстроку (чтобы в примере выше была только одна строка "something" в памяти, а остальные просто ссылались на неё по смещению)?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2014, 13:31     Могут ли две string разделять одни данные?
Посмотрите здесь:

C++ Как сравнить две переменные string
Сложить две строки string C++
* char - могут ли затереть данные? C++
C++ Как сравниеть две строчки std string не учитывая геристр букв?
C++ Как разделять интерфейс и данные?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.02.2014, 13:59     Могут ли две string разделять одни данные? #2
http://en.wikipedia.org/wiki/Copy-on..._copy-on-write

Добавлено через 2 минуты
гуглите так же паттерн flyweight
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
22.02.2014, 14:07     Могут ли две string разделять одни данные? #3
А не проще для таких задач использовать обычный массив символов:
C++
1
2
3
4
char str[]="example";
char *p1,*p2;
p1=str+3;// p1 - Строка, начинающаяся с с m (str[3])
p2=strchr(str,'a'); // p2 - Строка, начинающаяся с с a
Avazart
22.02.2014, 14:11
  #4

Не по теме:

Честно говоря никогда не понимал такого подхода, зачем создавать три строки одинакового содержания?
Зачем оптимизировать, это ведь мало вероятно.

nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.02.2014, 16:43  [ТС]     Могут ли две string разделять одни данные? #5
Jupiter, верно ли это для обычного присваивания std::string?
C++
1
2
3
4
5
string a, b;
a = " something ";
b = a.substr(4); // здесь b уже копия или ещё ссылка?
a[3] = 'x'; //а здесь?
a[5] = 'x'; //а здесь?
Мне нужно, чтобы во всех трех местах ссылка сохранилась. std::string может мне такое обеспечить?
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,587
Записей в блоге: 17
22.02.2014, 18:16     Могут ли две string разделять одни данные? #6
C++
1
2
3
b = a.substr(4); // новая строка на основе старой
a[3] = 'x'; // изменение старой строки
a[5] = 'x'; // изменение старой строки

Цитата Сообщение от nexen Посмотреть сообщение
Мне нужно, чтобы во всех трех местах ссылка сохранилась. std::string может мне такое обеспечить?
Лучше объясни накой оно тебе такое сдалось?

Не по теме:

Ты вообще на каком языке пишешь ? Какая ссылка ?

Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.02.2014, 18:34     Могут ли две string разделять одни данные? #7
Цитата Сообщение от nexen Посмотреть сообщение
std::string может мне такое обеспечить?
стандарт с++ не дает таких гарантий, потому это
Цитата Сообщение от nexen Посмотреть сообщение
верно ли это для обычного присваивания std::string?
implementation defined
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
22.02.2014, 18:40     Могут ли две string разделять одни данные? #8
string - Это STL контейнерный класс, который предназначен для работы со строками.
Соответственно, если хотите получать доступ к данным по адресу,
то используйте итераторы.
Пример из MS help:
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
#include <string>
#include <iostream>
using namespace std;
 
int main( ) 
{
   string str1 ( "No way out." ), str2;
   basic_string <char>::iterator strp_Iter, str1_Iter, str2_Iter;
   basic_string <char>::const_iterator str1_cIter;
 
   str1_Iter = str1.begin ( );
   cout << "The first character of the string str1 is: " 
        << *str1_Iter << endl;
   cout << "The full original string str1 is: " << str1 << endl;
 
   // The dereferenced iterator can be used to modify a character
   *str1_Iter = 'G';
   cout << "The first character of the modified str1 is now: " 
        << *str1_Iter << endl;
   cout << "The full modified string str1 is now: " << str1 << endl;
 
   // The following line would be an error because iterator is const
   // *str1_cIter = 'g';
 
   // For an empty string, begin is equivalent to end
   if (  str2.begin ( ) == str2.end ( ) )
      cout << "The string str2 is empty." << endl;
   else
      cout << "The string str2 is not empty." << endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2014, 20:09     Могут ли две string разделять одни данные?
Еще ссылки по теме:

C++ Не считываются данные структуры типа string
Нужно сравнить две переменные типа string C++
C++ Как сравнить две строки string, введенных с клавиатуры, и вывести на экран строку которая больше?

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

Или воспользуйтесь поиском по форуму:
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
22.02.2014, 20:09     Могут ли две string разделять одни данные? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Jupiter Посмотреть сообщение
стандарт с++ не дает таких гарантий, потому это
Ну вообще-то, если быть точным, стандарт С++11 как раз дает гарантии что строка std::string точно не будет реализована через COW.
В соответствии с пунктом 6 параграфа 21.4.1 ссылки и итераторы могут быть невалидными только в случаях:
— as an argument to any standard library function taking a reference to non-const basic_string as an
argument.
— Calling non-const member functions, except operator[], at, front, back, begin, rbegin, end, and
rend.
В случае COW строки вызов operator[] может потребовать сделать копию, что приведет существующие ссылки (полученные например через front()) в невалидное состояние, а это прямо запрещено вышеуказанным параграфом.
Для стандартов ниже С++11 - это было действительно implementation-defined.

Добавлено через 6 минут
Мне нужно, чтобы во всех трех местах ссылка сохранилась. std::string может мне такое обеспечить?
Можно попробовать вот этот класс.
Либо вот этот подход. (string_view)
Yandex
Объявления
22.02.2014, 20:09     Могут ли две string разделять одни данные?
Ответ Создать тему
Опции темы

Текущее время: 13:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru