| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Алгоритмы и функции STL |
| Автор: daimon2005 16.5.2006, 22:50 |
| К примеру говорится в книге Мейерса (Эффективное использование STL) что функция контейнера выполняетя быстрее, чем алгоритм, но пример реализации не идет, что не так set<int> s; . . . set<int>:: iterator p=s.find(4); //функция не идет (почему ?) set<int>:: iterator p=find(s.begin(),s.end(),4); //алгоритм идет... |
| Автор: Void 16.5.2006, 22:53 |
| daimon2005, что значит «функция не идет»? |
| Автор: daimon2005 16.5.2006, 23:07 | ||||
Void,
Error 1 error C2039: 'find' : is not a member of 'std::vector<_Ty>' c:\stl1\333333(set2)\333333(set2)\333333(set2).cpp 40 Хотя если так
Смысл? |
| Автор: Void 16.5.2006, 23:11 |
| daimon2005, метод find определен только у set, multiset, map и multimap. С поиском в последовательных контейнерах (sequences) прекрасно справляются обобщенные алгоритмы, и смысла создавать метод поиска не было. |
| Автор: DeadSoul 16.5.2006, 23:15 |
| Дополню: Смысл создавать функции одноименные алгоритмам есть только в том случае, если это "выгоднее" чем использовать алгоритмы. Например, "стоимость" поиска в map-е по значению О( log(n) ), где n - число элеметов, а стоимость поиска c использование алгоритма O( n ). Разницу чувствуешь? |
| Автор: daimon2005 16.5.2006, 23:30 |
| ОК, насчет set и vector(а) я понял а дальше цитирую дословно Мейерса (Эффективное использование STL) Столкнувшись с выбором между алгоритмом STL и одноименной функуией контейнера, предпочтение следует отдавать функции контейнера. Она почти всегда эффективнее работает и лучше интегрируется с обычным поведением контейнеров. Или это не так? Еще... 1000000 значений функция find - 40 сравнений... алгоритм find - 500000 сравнений. |
| Автор: Void 16.5.2006, 23:35 |
| daimon2005, как это противоречит тому, что было сказано выше? Да, это так. Если контейнер обладает существенным знанием о своей структуре, которое не может быть выражено с помощью итератора, его собственные функции будут эффективнее. |
| Автор: daimon2005 16.5.2006, 23:41 |
| Void, нет все правильно, вопрос другой, для чего необходимо было реализовывать механизм алгоритмов, и в каких случаях лучше использовать его. |
| Автор: Void 16.5.2006, 23:52 |
| daimon2005, алгоритмы необходимы, чтобы абстрагироваться от конкретной структуры данных. Так, линейный поиск одинаков везде, если только можно определить операции сравнения, перехода к следующему элементу и конец последовательности. Вместо того, чтобы писать его отдельно для вектора, списка и т.д., определели один общий алгоритм, работающий с итераторами. Алгоритмы могут работать с итераторами контейнеров STL, указателями, итераторами потоков ввода/вывода — всем, что обладает необходимыми операциями. |