Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2012, 21:51   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
То есть, вместо того, что бы простым и тривиальным способом избежать ненужного копирующего конструктора, вы предлагаете передавать данные по значению, и тратить время на копирующий конструктор?
мы уже с вами обсуждали этот вопрос.(правда тогда вы считали что мы копируем труп)
я там вам все обьяснил.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.01.2012, 22:05   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
мы уже с вами обсуждали этот вопрос.(правда тогда вы считали что мы копируем труп)
я там вам все обьяснил.
Я говорю: зачем тратить время на копирование, если можно получить тоже самое без копирования?

Вы мне говорите: а почему бы и не потратить зазря время и память? Вы считаете, что это рационально?

http://liveworkspace.org/code/a53c32...cf57803996c306
_Bers вне форума Ответить с цитированием
Старый 18.01.2012, 22:11   #13
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в первом коде да.

а вот в последнем нет, так как возвращается новая строка, а не тоже самое.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 01:38   #14
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Код:
string Delimiter(string Text, int Index, const char* Delimiter) {
	int n = 0, find = 0;
	find = Text.find(Delimiter, n);
	for (int i = 1; i <= Index; i++) {
		n = find + 1;
		find = Text.find(Delimiter, n);
	}
	return Text.substr(n, find - n); 
}
1 копирование при входе в тело функции.
2 копирование при создании временного объекта.
3 копирование при выходе из тела функции.

Теперь вот так:



Код:
void Delimiter(string& Text, int Index, const char* Delimiter) 
{
    int n = 0, find = 0;
    find = Text.find(Delimiter, n);
    for (int i = 1; i <= Index; i++) {
        n = find + 1;
        find = Text.find(Delimiter, n);
    }
    Text.assign(Text.begin()+n, Text.begin()+find);
}
1 Копирование при пересоздании строки.
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 02:07   #15
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

про 1 я сказал уже.
второго нет.(любой компиль убирает)
3 есть.

но теперь посмотрим что имеет ваш код, теперь он всегда меняет исходную строку, и не имеет результата, что нам не дает возможности использовать присваивание.
если нужно сохранить исходную строку от копирования три мы не уходим(даже больше, оно копирует большую строку).

или вы считаете себя сильно умнее той же std::string::substr?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 02:19   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
про 1 я сказал уже.
второго нет.(любой компиль убирает)
3 есть.
Ух ты! И в правду)
http://liveworkspace.org/code/1d12a3...9286205e377b61

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
но теперь посмотрим что имеет ваш код, теперь он всегда меняет исходную строку, и не имеет результата, что нам не дает возможности использовать присваивание.
Код:
string& Delimiter(string& Text, int Index, const char* Delimiter) 
{
    int n = 0, find = 0;
    find = Text.find(Delimiter, n);
    for (int i = 1; i <= Index; i++) {
        n = find + 1;
        find = Text.find(Delimiter, n);
    }
    Text.assign(Text.begin()+n, Text.begin()+find);
    return Text;
}

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если нужно сохранить исходную строку от копирования три мы не уходим(даже больше, оно копирует большую строку).

или вы считаете себя сильно умнее той же std::string::substr?
Код:
string& Delimiter(const string& Text, string& dst, int Index, const char* Delimiter) 
{
    int n = 0, find = 0;
    find = Text.find(Delimiter, n);
    for (int i = 1; i <= Index; i++) {
        n = find + 1;
        find = Text.find(Delimiter, n);
    }
    dst.assign(Text.begin()+n, Text.begin()+find);
    return dst;
}
Тут главное, понимать что нужно. И только 1 копирование
2 копирование - не_рациональное падение производительности.
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 08:36   #17
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ваш код не удобен в применении.
Цитата:
Ух ты! И в правду)
на что намек то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.01.2012, 10:21   #18
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
То есть, вместо того, что бы простым и тривиальным способом избежать ненужного копирующего конструктора, вы предлагаете передавать данные по значению, и тратить время на копирующий конструктор?
string Delimiter(const string &Text, int Index, const char* Delimiter)
ElectroMent вне форума Ответить с цитированием
Старый 19.01.2012, 11:17   #19
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ваш код не удобен в применении.на что намек то?
1. В каком смысле неудобен? Лень написать несколько дополнительных символов исходного кода?

Пускать лишьние циклы в холостую, терять производительность - это типа удобнее?

2. Это не намек. Я не знал, что компиль такое дело оптимизирует.
Думал 3 копирования будет. Ан нет, только 2.
Но фокус в том, что и 2 копирования - это тоже не_рационально, если без особых усилий можно получить только 1.
_Bers вне форума Ответить с цитированием
Старый 19.01.2012, 18:57   #20
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Пускать лишьние циклы в холостую, терять производительность - это типа удобнее?
там не будет ничего лишнего.

вы забываете так же про саму string::substr, она создает новый объект.
Цитата:
Лень написать несколько дополнительных символов исходного кода?
да лень, код должен быть удобен, а не предьявлять требование в виде out параметра(которого можно избежать)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделение данных одной ячейки jestya Microsoft Office Excel 4 29.09.2010 14:54
разделение данных в ячейках Viper_FMX Microsoft Office Excel 2 27.09.2010 02:43
Разделение данных на несколько ячеек d_adilet Microsoft Office Access 6 29.06.2010 09:28
Разделение массива данных на части Евгений К. Microsoft Office Excel 2 03.06.2010 13:41
Разделение. Maksim_27_10 Общие вопросы C/C++ 8 21.04.2010 20:40