понедельник, 13 июня 2011 г.

C++. Урок 9. Стандартные алгоритмы для работы с STL (algorithm)

В C++ существует множество спецальных алгоритмов для работы с массивами. Они позволяют сортировать данные в массиве, искать в нем какое-либо значение, менять элементы местами и т.д. Для их работы вам необходимо подкючить <algorithm> в начале программы.

Алгоритмы поиска.

Все алгоритмы поиска возвращают итератор на элемент, а не сам элемент.
  • find(begin,end,what) - ищет первый элемент со значенимем what в промежутке begin - end, где begin и end - итераторы соответствующего контейнера
  • adjacent_find(start,end) - ищет два последовательных совпадающих элемента между start и end и возвращает итератор на него
  • search(start,end,sbegin,send) - ищет между start и end последовательность sbegin-send

Алгоритмы сортировки

  • reverse(start,end) - инвертирует элементы последовательности start-end (т.е. сортирует в обратном порядке. Если было последовательность 1 2 3, то в результате получим 3 2 1)
  • random_shuffle(start,end) - сортирует элементы между start и end в случайном порядке
  • sort(start,end) - сортирует элементы от start до end в порядке возврастания.

Удаления элементов

  • remove(begin,end,what) - в промежутке begin-end удаляет все what
  • unique(begin,end) - удаляет все дубликаты

Другие функции

  • swap_ranges(start,end,start2) - меняет местами элементы от start до end с элементами от start2 до end2, end2 рассчитывается автоматом, чтобы промежуток start-end был равен промежтку start2-end2
  • replace(s,e,d1,d2) - меняет в промежутке s-e все элементы d1 на элементы d2
  • fill(begin,end,data) - заполнить промежуток от begin до end значением data
  • copy(start,end,new_start) - копирует промежуток от start до end в new_start (все параметры - итераторы)
  • count(sbegin,send,d) - подсчет количества элементов со значением d в промежутке sbegin - send
  • equal(start,end,start2) - возвращает true, если  start-end == start2 - end2 (количество элементов start-end равно количеству элементов start2-end2)
На первое время хватит. Это были одни из самых используемых функций, со временем материал будет дополнен.
Пример (немного абсурдный, ну да ладно):
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

int main()
{
ofstream out;
char filename[20];

ifstream in;

in.open("in.txt");

if (out==NULL)
{
cout< <"Error, can`t open file"<<endl;
return 0;
}

out.open("out.txt");
if (out==NULL)
{
cout<<"Error, can`t open file"<<endl;
return 0;
}
string s;
string text;

while  (in>>s)
text.append(s);

cout< <"Операции: вывести, сколько раз слово встречается  в файле: 1" <<endl;
cout<<"Sort file: 2"<<endl;
cout<<"Remove dublicates:3"<<endl;
cout<<"Random sort: 4"<<endl;
cout<<"Replace world to word: 5"<<endl;
cout<<"text v obratnom poradke: 6"<<endl;
cout<<"Write to file and exit:7"<<endl;
int status=0;
string::iterator start,end;
start=text.begin();
end=text.end();

while (true)
{
switch (status)
{  case 1:
{
cout<<"enter word"<<endl;
char word[100];
cin>>word;
cout< <"Result: "<<count(start,end,*word)<<endl;
break;

};
case 2:
{

sort(start,end);
cout<<"Done"<<endl;
break;
};
case 3:
{

unique(start,end);
cout<<"Done"<<endl;
break;
};
case 4:
{

random_shuffle(start,end);

cout<<"Done"<<endl;
break;
};
case 5:
{

cout<<"enter world 1"<<endl;
char word1[100];
cin>>word1;
cout< <"enter world 2"<<endl;
char word2[100];
cin>>word2;

replace(start,end,*word1,*word2);
cout< <"Done"<<endl;
break;
};
case 6:
{

reverse(start,end);
cout<<"Done"<<endl;
break;
};
case 7:
{
out<<text<<endl;

cout<<"good bye"<<endl;

return 0;
};
}

cin>>status;
}

return 0;
}

Комментариев нет:

Отправить комментарий