Есть тривиальная задача: на cin подается текстовый файл, его нужно принять, отсортировать и выдать в cout.
Я давно пишу на C++, но STL никогда не использовал, поэтому сделал так, как приведено ниже.
А как это делается правильно и более оптимально с точки зрения STL ?
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;
void main()
{
list<string>vs;
list<string>::iterator begin, end, it;
string st;
for (;;) {
cin >> st;
if (cin.eof()) break;
vs.push_back(st);
}
vs.sort();
begin = vs.begin();
end = vs.end();
for (it = begin; it != end; it ++)
cout << it->c_str() << "\r\n";
}
Здравствуйте, crazy25, Вы писали:
C>Есть тривиальная задача: на cin подается текстовый файл, его нужно принять, отсортировать и выдать в cout. C>Я давно пишу на C++, но STL никогда не использовал, поэтому сделал так, как приведено ниже. C>А как это делается правильно и более оптимально с точки зрения STL ? C>
C>#include <iostream>
C>#include <string>
C>#include <vector>
C>#include <list>
C>using namespace std;
C>void main()
C>{
C> list<string>vs;
C> list<string>::iterator begin, end, it;
C> string st;
C> for (;;) {
C> cin >> st;
C> if (cin.eof()) break;
C> vs.push_back(st);
C> }
C> vs.sort();
C> begin = vs.begin(); // объялять и присваивать отдельно - необязательно
C> end = vs.end(); // можно прямо в операторе цикла
C> for (it = begin; it != end; it ++) // пробел???? it ++
C> cout << it->c_str() << "\r\n";
C>}
C>
1. Если в строке есть пробелы, то оператор
cin >> st;
введет только до пробела. Нужно использовать функцию getline
getline(st, cin);
2. выводить в цикле можно непосредственно string
cout << *it<< "\r\n";
3. Еще вместо list можно использовать vector и тогда можно сортировать внешней функцмией sort
Ну, еще товарищи добавят...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, crazy25, Вы писали:
C>Есть тривиальная задача: на cin подается текстовый файл, его нужно принять, отсортировать и выдать в cout. C>Я давно пишу на C++, но STL никогда не использовал, поэтому сделал так, как приведено ниже. C>А как это делается правильно и более оптимально с точки зрения STL ?
Попробуй так
ВН>И все-таки, зачем list. Я так понимаю сортировка вектора эффективнее будет? (O(n*logn) по скорости, n по памяти)
На самом деле все не так очевидно. При сортировке вектора с помощью std::sort будут выпонятся копирования/разрушения элементов при свапе этих элементов. В случае строк, это не не слишком-то дешево.
При сортировке списка встроенным методом sort таких копирований/разрушений элементов не будет.
ЗЫ
Сортировка вектора строк может быть существенно ускорено, если предоставить оптимизированную версию swap для строк. Но VC6 STL этого не делает.
B>ЗЫ B>Сортировка вектора строк может быть существенно ускорено, если предоставить оптимизированную версию swap для строк. Но VC6 STL этого не делает.
А STLport?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, Bell, Вы писали:
B>>ЗЫ B>>Сортировка вектора строк может быть существенно ускорено, если предоставить оптимизированную версию swap для строк. Но VC6 STL этого не делает. LVV>А STLport?
В STLport опримизированная swap для basic_string есть, но VC6 использовать ее все равно не может.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, Bell, Вы писали:
B>>>ЗЫ B>>>Сортировка вектора строк может быть существенно ускорено, если предоставить оптимизированную версию swap для строк. Но VC6 STL этого не делает. LVV>>А STLport?
B>В STLport опримизированная swap для basic_string есть, но VC6 использовать ее все равно не может.
Почему? STLport же элементарно прикручивается к VC6
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Вопрос к знатокам STL (VC++)
От:
Аноним
Дата:
19.02.04 10:12
Оценка:
Здравствуйте, crazy25, Вы писали:
C>Есть тривиальная задача: на cin подается текстовый файл, его нужно принять, отсортировать и выдать в cout. C>Я давно пишу на C++, но STL никогда не использовал, поэтому сделал так, как приведено ниже. C>А как это делается правильно и более оптимально с точки зрения STL ?
B>>В STLport опримизированная swap для basic_string есть, но VC6 использовать ее все равно не может. LVV>Почему?
Потому что для использования этой функции требуется, чтобы компилятор поддерживал частичное упорядочение шаблонов функций. VC6 к сожалению такой возможеостью не обладает, поэтому макрос _STLP_FUNCTION_TMPL_PARTIAL_ORDER для VC6 не определен, и супер быстрый вариант swap для std::string просто не импользуется, т.к. он как раз стоит в блоке условной компиляции с этим макросом.
LVV> STLport же элементарно прикручивается к VC6
Это не значит, что при этом используются все возможности STLport
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Че-то я не догоняю, похоже. Проблема c partial-reordering в VC 6.0-7.0 (и ранее) есть. Потому свап для вектора хитро определен как
L_L>
Здравствуйте, crazy25, Вы писали:
C>Есть тривиальная задача: на cin подается текстовый файл, его нужно принять, отсортировать и выдать в cout.
Читаю сейчас книгу Мэтью Г. Остина "Обобщенное программировани и STL".
В первой же главе как раз рассматривался вопрос сортировки строк.
Мне понравился подход, позволяющий получить отсортированное представление текстового файла, не трогая организацию строк.
Альтернативный взгляд на данные.
Дальше я процетирую книгу и пример из нее.
Если в вашей прогарамме используется большое количество строк, лучше совсем не применять класс string.
Зачастую оказывается более эффективным собрать все строки в одну "таблицу строк" и, когда вам нужно обратиться к конкретной строке,
указывать на строки таблицы.
<slip>
Вместо одного вектора для хранения строк нам понадобятся два: один — для таблицы строк и другой — для указателей на строки в таблице.
<skip>
Принимая во внимание способы работы большинства алгоритмов STL, удобней представить каждую строчку в виде пары итераторов
в строковой таблице: один — указывающий на первый символ строчки и другой — указвыающий на ее конец (за последний символ).
Текст программы (комментарии, оформление и пр. я старался точно скопировать):
Здравствуйте, Dmi3evS, Вы писали:
DS>Здравствуйте, crazy25, Вы писали:
C>>Есть тривиальная задача: на cin подается текстовый файл, его нужно принять, отсортировать и выдать в cout.
DS>Читаю сейчас книгу Мэтью Г. Остина "Обобщенное программировани и STL". DS>В первой же главе как раз рассматривался вопрос сортировки строк. DS>Мне понравился подход, позволяющий получить отсортированное представление текстового файла, не трогая организацию строк. DS>Альтернативный взгляд на данные. DS>Дальше я процетирую книгу и пример из нее.
Спасибо за интересный метод, но... он слишком трудоемкий для такой вобщем-то простой задачи.
Хотелось бы применить наиболее простое, но в то же время эффективное решение.
Здравствуйте, crazy25, Вы писали:
C>А если нужно именно со строками такое проделывать, без разбора на слова, такое возможно ? C>Есть для этого красивые решения ?