В 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; }
Источник: http://adorning.ru/2010/01/17/c-urok-9-standartnyie-algoritmyi-dlya-rabotyi-s-stl/ |