Здравствуйте, igna, Вы писали:
I>Это правило возможно устарело. VC++, GCC и Intel C++ поддерживают RVO: http://en.wikipedia.org/wiki/Return_value_optimization
IRO>>З.Ы. не использовать шаблоные типы напрямую (заменить на typedef)
I>Так. А это почему?
Это правило хорошего тона распостраняется на контейнеры у которых есть скрытый кэш.
да RVO порезало это правило, например std::list теперь так немного безсмыслено передавать. (Но например мне не впадло передать по ссылке, и душа не болит)
Здравствуйте, IROV.., Вы писали:
IRO>+ Разьясню, вектор который мы туда передадим может уже быть за ресайзеный(выделено памяти) и тогда внутрения функция ресайз (в тру версии) не будет ничего делать а проскипается, вот эту оптимизацию компилятор в твоем случаее не сделает.
Можно конкретный пример? Не обязательно для приведенного мной случая, а какой-нибудь самый простенький, где "заресайзеный" и "проскипается", и чтобы компилятор оптимизацию не сделал.
Здравствуйте, igna, Вы писали:
I>Пример реализован прямолинейно, а как бы вы написали?
не знаю что такое Text в твоей проге, но если гдето там (в коде до указанного примера) есть буфер (char* или std::string например) с текстом над которым нужно произвести данные зверства...
0) я бы сначла нарезал его boost::algorithm::split'ом на предложения (например по символу '.' в тексте), результат получил бы в std::vector<boost::iterator_range<char*> > или std::vector<boost::iterator_range<std::string::const_iterator> > (не знаю в чем у тя хрянятся строки)
1) потом проходясь по вектору range'й резал бы по словам, опять таки split'ом в вектор range'й и полученые вектора складывал бы в вектор векторов буст итератор рэнджей от констных стринговых итераторов
не знаю уж зачем тебе такое надо... -- не иначе словарь составляешь для брутфорсового подбора паролей
в результате не буит никаких копирований строк вообще... ну и размер внешнего вектора тоже буит известен после шага 0
Re[3]: Заполняем vector<vector<string> >
От:
Аноним
Дата:
12.08.09 12:28
Оценка:
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Аноним, Вы писали:
I>
I> return count;
I>
I>Зачем count?
А вдруг понадобится узнать сколько все таки элементов скопировалось? Тем более что в функцию можно
передать vvs уже частично заполненый.
Вообще стараюсь, чтобы функция которая копирует данные из объекта одного типа в объект имееющий другой тип что то возвращала.
Почти всегда это было нужно.
Здравствуйте, zaufi, Вы писали:
Z>не знаю что такое Text в твоей проге, но если гдето там (в коде до указанного примера) есть буфер (char* или std::string например) с текстом над которым нужно произвести данные зверства...
полностью с вами согласен — правда можно чуток поковырять детали
I>>Пример реализован прямолинейно, а как бы вы написали? Z>не знаю что такое Text в твоей проге, но если гдето там (в коде до указанного примера) есть буфер (char* или std::string например) с текстом над которым нужно произвести данные зверства...
Z>0) я бы сначла нарезал его boost::algorithm::split'ом на предложения (например по символу '.' в тексте), результат получил бы в std::vector<boost::iterator_range<char*> > или std::vector<boost::iterator_range<std::string::const_iterator> > (не знаю в чем у тя хрянятся строки)
Если разделители фиксированного размера, то рулит хранение позиций начала предложений. Экономия памяти на 64х битной платформе в типовом случае в 4 раза (разумеется при известных ограничениях). Так что вы несомненно правы, а предлагается лишь небольшое влияние на константы алгоритма.
Z>1) потом проходясь по вектору range'й резал бы по словам, опять таки split'ом в вектор range'й и полученые вектора складывал бы в вектор векторов буст итератор рэнджей от констных стринговых итераторов
вектор векторов можно скипнуть совсем — достаточно 2 вектора : вектор слов + на каждое предложение индекс начала. Причем вектор наверное стоит заменить на что-то блочное (упражнения для читателя).
Z>не знаю уж зачем тебе такое надо... -- не иначе словарь составляешь для брутфорсового подбора паролей
Он известный ценитель этого форума так что код скорее всего измеряет чью-то скорость.
Z>в результате не будет никаких копирований строк вообще... ну и размер внешнего вектора тоже буит известен после шага 0
В общем то все верно для generic case. Но на практике часто можно воспользоваться тем, что данные ограничены по длине.
Здравствуйте, zaufi, Вы писали:
Z>0) я бы сначла нарезал его boost::algorithm::split'ом на предложения (например по символу '.' в тексте),...
Кстати, предложение может заканчиваться вопросительным или восклицательным знаком. Кроме того оно может окачиваться троеточием, которое не должно приводить к появлению двух пустых предложений. Пустых предложений вообще не должно быть, таким образом двоеточие не являющееся началом троеточия должно приводить к ошибке и выводу соответствующего сообщения. Затем точка внутри кавычек не является концом предложения, причем кавычки могут быть одинарные, двойные и другие определенные в UNICODE. Точка после цифры в начале предложения не является признаком его конца и так далее...
Здравствуйте, igna, Вы писали:
I>Пример внизу заполняет vector<vector<string> > беря значения из некой коллекции:
I>Пример реализован прямолинейно, а как бы вы написали?
Я бы уволил с работы человека, использующего такие конструкции.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, IROV.., Вы писали:
IRO>>+ Разьясню, вектор который мы туда передадим может уже быть за ресайзеный(выделено памяти) и тогда внутрения функция ресайз (в тру версии) не будет ничего делать а проскипается, вот эту оптимизацию компилятор в твоем случаее не сделает.
I>Можно конкретный пример? Не обязательно для приведенного мной случая, а какой-нибудь самый простенький, где "заресайзеный" и "проскипается", и чтобы компилятор оптимизацию не сделал.
Прошу прощения, похоже я недостаточно точно выразился. Под конкретным примером имел в виду код, который можно скомпилировать, запустить и посмотреть, как компилятор не соптимизирует возврат по значению.
I>Прошу прощения, похоже я недостаточно точно выразился. Под конкретным примером имел в виду код, который можно скомпилировать, запустить и посмотреть, как компилятор не соптимизирует возврат по значению.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Шахтер, Вы писали:
Ш>>Я бы уволил с работы человека, использующего такие конструкции.
I>Что за воинствующее мракобесие?
Это не воинствующее мракобесие, а твой воинствующий дилетантизм.
I>
I>С.7 Multidimensional Arrays
I>It is not uncommon to need a vector of vectros, a vector of vector of vectors, etc. ...
I>(The C++ Programming Language, Third Edition, Bjarne Stroustrup)
stl::vector для решения этой задачи не подходит категорически. Потому что в него нельзя складывать объекты с тяжелым оператором копирования -- слишком накладно получается. А использовать дешевые move/swap он не позволяет по дизайну. А здесь два уровня -- исключительно неэффективное решение.
Здравствуйте, Шахтер, Вы писали:
Ш>stl::vector для решения этой задачи не подходит категорически. Потому что в него нельзя складывать объекты с тяжелым оператором копирования -- слишком накладно получается. А использовать дешевые move/swap он не позволяет по дизайну. А здесь два уровня -- исключительно неэффективное решение.
Самое смешное что rvalue references в VS2010 ускоряют этот ужас раз в 20. И такой код будет и дальше применяться не смотря на массовые расстрелы Недавно на блоге студии был пример ускорения как раз vector<vector<string>>
Здравствуйте, Шахтер, Вы писали:
Ш>stl::vector для решения этой задачи не подходит категорически. Потому что в него нельзя складывать объекты с тяжелым оператором копирования -- слишком накладно получается. А использовать дешевые move/swap он не позволяет по дизайну. А здесь два уровня -- исключительно неэффективное решение.
Ты бы все же посмотрел пример vector of vectors у Страуструпа. Можешь еще примечание на полях сделать, мол автор есть дилетант и предлагаемое им решение неэффективно.