Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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

Код

vector<int>::iterator p;
p=s.find(4);


Error    1    error C2039: 'find' : is not a member of 'std::vector<_Ty>'    c:\stl1\333333(set2)\333333(set2)\333333(set2).cpp    40

Хотя если так 

Код

.

typedef vector<int> S_INT ;
.
int main()
  S_INT p;
.
S_INT::iterator ii;
    ii=p.find(8);



Смысл?  

Автор: 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, указателями, итераторами потоков ввода/вывода — всем, что обладает необходимыми операциями. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)