Вход/Регистрация
Программирование. Принципы и практика использования C++ Исправленное издание
вернуться

Страуструп Бьерн

Шрифт:

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));

// ...

}

Из-за моей ошибки этот алгоритм выпал из стандарта 1998 ISO Standard. В настоящее время эта ошибка исправлена, но до сих пор встречаются реализации языка С++, в которых нет алгоритма
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

  • Читать дальше
  • 1
  • ...
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346
  • 347
  • 348
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: