В данной главе приведены ряд примеров, представляющих собой постепенное усложнение задания и его решение.
Пример 1:
Дан целочисленный массив. Отсортировать элементы массива в убывающем порядке.
Решение:
Copy #include <algorithm>
#include <functional>
#include <iostream>
int main (){
int a [ 5 ] = { 5 , 2 , 1 , 8 , 7 };
std :: sort (a , a + 5 , std :: less < int >());
int i;
for (i = 0 ; i != 5 ; ++ i){
std :: cout << a [i] << " " ;
}
return 0 ;
}
Пример 2:
Считать из файла input.txt массив целых чисел, разделенных пробельными символами. Отсортировать их и записать в файл output.txt.
Решение:
Copy #include <vector>
#include <algorithm>
#include <fstream>
int main (){
std :: ifstream fin ( "input.txt" );
std :: ofstream fout ( "output.txt" );
std :: vector <int> v;
std :: copy (std :: istream_iterator < int >(fin) ,
std :: istream_iterator < int >() ,
std :: inserter (v , v . end ()));
std :: sort ( v . begin () , v . end ());
std :: copy ( v . begin () ,
v . end () ,
std :: ostream_iterator < int >(fout , " " ));
return 0 ;
}
Пример 3:
В файле input.txt хранится список, содержащий информацию о людях: фамилия, имя, возраст. Считать эти данные в массив, отсортировать их по возрасту и записать в файл output.txt. Вывести на экран информацию о человеке, чей возраст более 20, но менее 25 лет.
Решение:
Copy #include <string>
#include <vector>
#include <fstream>
#include <algorithm>
struct Man {
std :: string firstname , secondname;
size_t age;
};
std :: ostream & operator << (std :: ostream & out , const Man & p){
out << p . firstname << " " << p . secondname << " " << p . age;
return out;
}
std :: istream & operator >> (std :: istream & in , Man & p){
in >> p . firstname >> p . secondname >> p . age;
return in;
}
struct comparator {
comparator (){}
bool operator ()( const Man & p1 , const Man & p2){
return p1 . age < p2 . age;
}
};
struct Predicat {
size_t begin , end;
Predicat ( int p1 , int p2) : begin (p1) , end (p2) {}
bool operator ()( const Man & p){
return ( p . age > begin) && ( p . age < end);
}
};
int main (){
std :: ifstream fin ( "input.txt" );
std :: ofstream fout ( "output.txt" );
std :: vector < Man > v;
std :: vector< Man > :: iterator i;
std :: copy (std :: istream_iterator < Man >(fin) ,
std :: istream_iterator < Man >() ,
std :: inserter (v , v . end ()));
std :: sort ( v . begin () , v . end () , comparator ());
i = std :: find_if ( v . begin () , v . end () , Predicat ( 20 , 25 ));
std :: cout << ( * i) << std :: endl;
std :: copy ( v . begin () ,
v . end () ,
std :: ostream_iterator < Man >(fout , "\n" ));
return 0 ;
}
Пример 4:
Сложение двух трехмерных векторов
Copy #include <algorithm>
#include <array>
#include <iostream>
#include <functional>
#include <iterator>
typedef std :: array <int , 3 > v3d;
v3d operator + ( const v3d & a , const v3d & b){
v3d tmp;
std :: transform (
a . begin () , a . end () ,
b . begin () ,
tmp . begin () ,
std :: plus <v3d :: value_type >());
return tmp;
}
std :: ostream & operator << (std :: ostream & out , const v3d p){
std :: copy ( p . begin () , p . end () , std :: ostream_iterator <v3d :: value_type >(out , " " ));
return out;
}
int main ( int argc , char** argv) {
v3d a = { 1 , 2 , 3 } ,
b = { 3 , 2 , 1 } ,
c;
c = a + b;
std :: cout << c;
return 0 ;
}