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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
#1

Еще одно размышление о string из STL - C++

28.10.2007, 21:17. Просмотров 1328. Ответов 12
Метки нет (Все метки)

Если строки в STL по стандарту могут совместно использовать дин и тот же участок памяти (а это именно следуя из стандарта), тогда следующие операции со строками законны и даже должны приветствоваться:
C++
1
2
3
4
5
6
string GetMyFavouriteString() 
{
string tmp_string;
tmp_string = 'My favourite phrase';
return tmp_string;
}
так ли это? Поправте меня если я что не так понял.

Зарание благодарю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2007, 21:17     Еще одно размышление о string из STL
Посмотрите здесь:

STL и string - C++
начал тут 1 задачу на форуме решать в text1 какой-то текст, мы ищем в нем слова str и после них вставляем слова str2 вообщем я не...

Размышления о string из STL - C++
Класс string из шаблона STL замечательная вещь! Но вчера он меня чуть не убил... #include <string> using namespace std ... string a...

Добавить еще одно значение if - C++
Доброго времени суток! Вот только начал изучать c++ и программирование в целом, нашел этот прекрасный форум, хочу спросить один...

[STL] Работа со std::string - C++
Привет, форум. Подскажите, как можно грамотно скопировать "слово" из строки, с указанием начала и конца позиций. Например: string...

Undefined symbol string (STL) - C++
подключаю следующие библиотеки #include <iostream.h> #include <vector.h> #include <string.h> using namespace std; void...

Использование контейнера string из библиотеки STL - C++
Дан массив слов. Сформировать новое слово из символов слов массива, стоящих после последнего символа ‘*’ в слове. Сформировать предложение...

Класс, найти ошибки + вписать еще одно условие - C++
Создать программу, вводящую в цикле несколько дробей (не более заданного количества N), и находящую для введенных дробей две суммы: сумму...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VitSoft
0 / 0 / 0
Регистрация: 25.09.2007
Сообщений: 92
29.10.2007, 13:09     Еще одно размышление о string из STL #2
Hi !!
Если Вас не затруднит и Вам понравится мой сайт
я бы просил Вас положить ваши размышления у меня на сайте. В раздел форума FAQ

[сообщение отредактировано модератором]
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
29.10.2007, 13:34  [ТС]     Еще одно размышление о string из STL #3
Скорее я выложу его на форум - фактически это больше вопрос, чем размышление, хотя вопрос и не срочный, но ответ на него мне все-таки хотелось бы получить.
Brother
Сообщений: n/a
30.10.2007, 08:55     Еще одно размышление о string из STL #4
Да нормально все... В хорошей реализации при return не должно происходить непосредственное копирование символов строки (хотя для string вызовется конструктор копирования, который скопирует указатель на данные, а не сами данные). Вроде как оптимизация
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.10.2007, 11:25  [ТС]     Еще одно размышление о string из STL #5
Мне тоже хочеться в это верить.
Brother
Сообщений: n/a
30.10.2007, 16:22     Еще одно размышление о string из STL #6
Гм... А в чем соменения-то? Что-то я не догоняю...
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
06.01.2008, 15:48     Еще одно размышление о string из STL #7
а в чем трик - абсолютно законный код - все возвращается по значению - в чем проблема-то.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
06.01.2008, 16:38  [ТС]     Еще одно размышление о string из STL #8
Все нормально, теперь я знаю, что строки STL используют разделяемую память, поэтому этот код не просто законный но и приветствуется - во время возвращения значения не происходит копирования всего содержания временной строки из фунции в строку, которой присваивается результат, происходит просто обмен указателем на память - хороший трюк. Я просто этого не знал.

Все равно, спасибо за соучастие.

С уважением, Владимир.
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
06.01.2008, 16:52     Еще одно размышление о string из STL #9
Понятно ... на зачем пихать во временную переменную ? (вызов конструктора копирования - все же накладно) - а у тебя он вызывается 2 раза ... вернее 1 раз кострукторо копирования - второй раз о
C++
1
2
3
4
5
6
string GetMyFavouriteString() 
{
string tmp_string;//тут вызывается default ctor
tmp_string = 'My favourite phrase';//тут операция присваивания ...
return tmp_string;//тут copy ctor ...
}
вот более оптимальный вариант:
C++
1
2
3
4
5
string & GetMyFavouriteString() 
{
  static string strFavouritePhrase = 'My favourite phrase';
  return strFavouritePhrase;
}
так как обект статический - создается 1 раз (да и то если функция будет вызвана хоть раз)... возвращается по ссылке - значит копирования не происходит ....

А вообзе стринговые литералы есть КОНСТАНТЫ (=> время жизни у них - глобальное)- посему ВПОЛНЕ законен такой код (без оборачивания в STL-ный стринг)
C++
1
2
3
4
5
char * GetMyFavouriteString() 
{
  char *szFavouritePhrase = 'My favourite phrase';
  return strFavouritePhrase;
}
или
C++
1
2
3
4
char * GetMyFavouriteString() 
{
  return 'My favourite phrase';
}
Igor Soukhov,
Member of Russian Software Developer Network - rsdn.ru
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
06.01.2008, 17:10  [ТС]     Еще одно размышление о string из STL #10
Кому как... Я предпочитаю динамичную строку, где можно менять не только содержание, но и размер - больше свободы знаете ли.
Кстати, раз уж речь зашла о ссылках, как поступать если функция объеявлена как возвращающая ссылку на объект, но по определенным причинам не может выполнить этого? Что возвращать?

С уважением, Владимир.
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
06.01.2008, 21:22     Еще одно размышление о string из STL #11
Я всего лишь НЕМНОГО =) оптимизировал твой/ваш пример.

>Кстати, раз уж речь зашла о ссылках, как поступать если функция >объеявлена как возвращающая ссылку на объект, но по определенным >причинам не может выполнить этого? Что возвращать?
в таких случаях порядочная функция кидает исключение. А если
это сложно - то все таки постарайся избегать такого дизайна.

То есть от функции c с таким прототипом и кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
string& GetString(string input)
{
  static string strRet;  
  if (input.length() == 0)
  {
   //dont know what to to here ...
  }
  else
     strRet = input;  
 
  return strRet;
}
перейти к подобному:
C++
1
2
3
4
5
6
7
8
9
10
11
bool GetString(string input, string& strOut)
{
  if (input.length() == 0)
  {
    //returning false as the signal that processing failed.
    return false;
  }
  else
     strOut = input;  
   return true;
}
исключения - это конечно самое лучшее решение - но
не для начинающих.

Igor Soukhov,
Member of Russian Software Developer Network - www.rsdn.ru
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
07.01.2008, 10:24  [ТС]     Еще одно размышление о string из STL #12
Да ладно тебе, мы уже не маленькие , то есть ты предлагаешь использовать исключения - это то единственное к чему я также пришел.
Тот другой вариант не тянет, так как обычно я использую ссылку на обект как возвращаемый параметр только в тех функциях которые планирую использовать в выражениях или как параметры других функций...

Спасибо за ответ.
С уважением, Владимир
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2008, 10:37     Еще одно размышление о string из STL
Еще ссылки по теме:

STL String. Вывести слово и после него количество символов - C++
Здраствуйте! У меня есть например строка string, покажите пожалуйста на примере как можно выделять слова этой строки, например вывести...

Можно ли в файле в последовательность чисел вставить как-нибудь еще одно число? - C++
вопрос: можно ли в файле в последовательность чисел вставить как-нибудь еще одно число стандартными средствами (не создавая доп. объектов)?...

В массиве после каждого числа, состоящего из одинаковых цифр, вставить еще одно такое же число - C++
В массиве целых положительных чисел после каждого числа, состоящего из одинаковых цифр, вставить еще одно такое же число. Зараннее...

Одно и двух байтовые кодировки и std::string - C++
Загружаю в std::string текст в юникоде, всё отлично выводится, но когда я стал получать string::length(), то получил количество байт в...

Использование библиотеки STL , контейнер string. Дан массив слов.Надо удалить все цифры из слов - C++
#include "StdAfx.h" #include <string> #include <iostream> #include <algorithm> using namespace std; int main() { string str...


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

Или воспользуйтесь поиском по форуму:
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
07.01.2008, 10:37     Еще одно размышление о string из STL #13
>Да ладно тебе, мы уже не маленькие , то есть ты предлагаешь
Sorry - не хотел обидеть или задеть.

>использовать исключения - это то единственное к чему я также пришел.
>Тот другой вариант не тянет, так как обычно я использую ссылку на >обект как возвращаемый параметр только в тех функциях которые >планирую использовать в выражениях или как параметры других
угумс ... понятно.

хм... вопрос - а тут подпись как нить можно настороить ? =)

--Igor Soukhov, www.rsdn.ru
Yandex
Объявления
07.01.2008, 10:37     Еще одно размышление о string из STL
Ответ Создать тему
Опции темы

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