Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
#1

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

22.02.2014, 13:31. Просмотров 299. Ответов 8
Метки нет (Все метки)

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

Как разделять интерфейс и данные? - C++
Всем привет, Собственно, нужно ли разделять GUI и функции работы с данными? Если да (надеюсь, что да), то какие общие принципы...

Есть ли аналог Map <String,String> чтобы передавать его как указатель на данные? - C++
Добрый день, подскажите, есть ли аналог Map &lt;String,String&gt; чтобы передавать его как указатель на данные? Заранее спасибо!

* char - могут ли затереть данные? - C++
Уважаемые форумчане, скажите пожалуйста если я использую *char в своей программе указатель хранит же лишь адрес первого элемента..могу ли я...

Сложить две строки string - C++
Вот собсна код в котором я пытаюсь сложить две string строки: #include &lt;string&gt; int main() { string pyt1 = &quot;ThisIs&quot;; ...

Как сравнить две переменные string - C++
Есть две переменные типа string в одной записано string X=&quot;AB BA AS AX&quot;; В другой string Y=&quot;AB&quot;; В строке X cимволы...

Нужно сравнить две переменные типа string - C++
Мне нужно сравнить 2 переменные типа string,нашел эту функцию,но почему то у меня выдает ошибку Error:class &quot;std...

8
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.02.2014, 13:59 #2
http://en.wikipedia.org/wiki/Copy-on..._copy-on-write

Добавлено через 2 минуты
гуглите так же паттерн flyweight
0
zss
Модератор
Эксперт С++
6679 / 6241 / 2080
Регистрация: 18.12.2011
Сообщений: 16,301
Завершенные тесты: 1
22.02.2014, 14:07 #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
0
Avazart
22.02.2014, 14:11
  #4

Не по теме:

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

0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.02.2014, 16:43  [ТС] #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 может мне такое обеспечить?
0
Avazart
Эксперт С++
7457 / 5503 / 314
Регистрация: 10.12.2010
Сообщений: 24,553
Записей в блоге: 17
22.02.2014, 18:16 #6
C++
1
2
3
b = a.substr(4); // новая строка на основе старой
a[3] = 'x'; // изменение старой строки
a[5] = 'x'; // изменение старой строки

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

Не по теме:

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

0
Jupiter
Каратель
Эксперт С++
6566 / 3987 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.02.2014, 18:34 #7
Цитата Сообщение от nexen Посмотреть сообщение
std::string может мне такое обеспечить?
стандарт с++ не дает таких гарантий, потому это
Цитата Сообщение от nexen Посмотреть сообщение
верно ли это для обычного присваивания std::string?
implementation defined
1
zss
Модератор
Эксперт С++
6679 / 6241 / 2080
Регистрация: 18.12.2011
Сообщений: 16,301
Завершенные тесты: 1
22.02.2014, 18:40 #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;
}
0
DrOffset
7504 / 4500 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
22.02.2014, 20:09 #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)
2
22.02.2014, 20:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2014, 20:09
Привет! Вот еще темы с ответами:

Как сравнить две строки типа string? - C++
C типом char все просто. Поиск по Фамилии и имени. char name,name1,address, dom; int h=0; cout&lt;&lt;&quot;Введите Фамилию &quot;; ...

Как сравниеть две строчки std string не учитывая геристр букв? - C++
Как сравнить две строчки std string не учитывая геристр букв? :wall:

Определить содержат ли две строки одни и те же символы - VBA
Доброго времени суток, проблема такая: есть строка A, содержащая, к примеру: 10 15 20, то бишь числа, разделенные пробелом. Нужно сверить...

Разные фильтры на одни данные - MS Excel
Есть таблица на 1м листе, на ней сделан фильтр, нужно чтоб на втором листе отображалась та же таблица, но была возможность применять другой...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.