Шрифт:
ostream_iterator<string> oo(os," "); // создает итератор для потока
// вывода
В этом случае результаты вывода выглядели бы так:
bit dog man the
21.7.3. Использование класса set для поддержания порядка
Существует еще более простой способ получить такой вывод: использовать контейнер
set
, а не vector
.
int main
{
string from, to;
cin >> from >> to; // имена исходного и целевого файлов
ifstream is(from.c_str); // создаем поток ввода
ofstream os(to.c_str); // создаем поток вывода
istream_iterator<string> ii(is); // создаем итератор ввода
// из потока
istream_iterator<string> eos; // сигнальная метка для ввода
ostream_iterator<string> oo(os," "); // создаем итератор
// вывода в поток
set<string> b(ii,eos); // b — вектор, который инициализируется
// данными из потока ввода
copy(b.begin,b.end,oo); // копируем буфер в поток вывода
}
set
, дубликаты игнорируются. Более того, элементы контейнера set
хранятся в требуемом порядке. Если в вашем распоряжении есть правильные инструменты, то большинство задач можно решить без труда. 21.7.4. Алгоритм copy_if
Алгоритм
copy
выполняет копирование без каких-либо условий. Алгоритм unique_copy
отбрасывает повторяющиеся соседние элементы, имеющие одинаковые значения. Третий алгоритм копирует только элементы, для которых заданный предикат является истинным.
template<class In,class Out,class Pred>
Out copy_if(In first,In last,Out res,Pred p)
// копирует элементы, удовлетворяющие предикату
{
while (first!=last) {
if (p(*first)) *res++ = *first;
++first;
}
return res;
}
Используя наш объект-функцию
Larger_than
из раздела 21.4, можем найти все элементы последовательности, которые больше шести.
void f(const vector<int>& v)
// копируем все элементы, которые больше шести
{
vector<int> v2(v.size);
copy_if(v.begin,v.end,v2.begin,Larger_than(6));
// ...
}
copy_if
. В таком случае просто воспользуйтесь определением, данным в этом разделе. 21.8. Сортировка и поиск
map
и set
, или выполняя сортировку. Наиболее распространенной и полезной операцией сортировки в библиотеке STL является функция sort
, которую мы уже несколько раз использовали. По умолчанию функция sort
в качестве критерия сортировки использует оператор <
, но мы можем задавать свои собственные критерии.
template<class Ran> void sort(Ran first, Ran last);
template<class Ran,class Cmp> void sort(Ran first,Ran last,Cmp cmp);
В качестве примера сортировки, основанной на критерии, определенном пользователем, покажем, как упорядочить строки без учета регистра.
struct No_case { // lowercase(x) < lowercase(y)
bool operator(const string& x, const string& y) const