Шаг 218.
Библиотека STL. Итераторы STL. Вспомогательные функции итераторов. Перестановка элементов функцией iter_swap()

    На этом шаге мы рассмотрим функцию перестановки элементов.

    Простая вспомогательная функция iter_swap() меняет местами элементы, на которые ссылаются два итератора:

  #include <algorithm>
  void iter_swap (ForwardIterator pos1, ForwardIterator pos2)

    Меняет местами элементы, на которые ссылаются итераторы pos1 и pos2. Итераторы не обязаны относиться к одному типу. Тем не менее значения должны быть совместимы по присваиванию.

    Простой пример использования функции iter_swap():

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream>
#include <iterator>
#include <list>
#include <algorithm>

#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;


std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

template <class T>
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")
{
  typename T::const_iterator pos;
  std::cout << ToRus(optcstr);
  for (pos=coll.begin(); pos!=coll.end(); ++pos) {
    std::cout <<*pos <<' ';
  }
  std::cout << std::endl;
}

int main(int argc, char* argv[])
{
  list<int> coll;

  // Вставка элементов от 1 до 9 
  for (int i=1; i<=9; ++i) {
    coll.push_back(i); 
  }

  PRINT_ELEMENTS(coll,"Исходный список:\n");

  // Перестановка первого и второго значений 
  iter_swap (coll.begin(),++coll.begin());
  PRINT_ELEMENTS(coll,"Список после перестановки первого и второго элемента:\n");

  // Перестановка первого и последнего значений 
  iter_swap (coll.begin(), --coll.end());
  PRINT_ELEMENTS(coll,"Список после перестановки первого и последнего элемента:\n");

  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Результат выполнения программы выглядит так:


Рис.1. Результат работы приложения

    Учтите, что с векторами эта программа обычно не работает. Дело в том, что операции ++coll.begin() и --coll.end() выполняются с временными указателями (дополнительная информация на эту тему приведена на 215 шаге).

    Со следующего шага мы начнем знакомиться с итераторными адаптерами.




Предыдущий шаг Содержание Следующий шаг