(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Стандартные алгоритмы и массивы C++ (исходники)

Источник: CppBuilder
Michel Leunen

Вы никогда не думали о том, что было бы просто замечательно, если бы вы могли использовать стандартные алгоритмы с массивами языка C++? Да, это можно сделать! Стандартные алгоритмы разработаны для того, чтобы использовать стандартные контейнеры и итераторы, но контейнеры представляют собой ничто иное, как некую разновидность "умных" массивов, а итераторы - ничто иное, как указатели.

Например, алгоритм сортировки объявлен следующим образом:

void sort (RandomAccessIterator first, RandomAccessIterator last);

И у вас может возникнуть искушение использовать его как-то в этом роде:

int array[10];
std::sort(&array[0], &array[10]);

Проблема в том, что использование &array[10] приводит к неопределенному поведению, так как элемент array[10] уже лежит за границами массива. Но использование арифметики указателей вполне допустимо. Вы можете обратиться к указателю, который адресует конечный элемент массива. Такой код будет верным:

int array[10];
std::sort(array, array+10);

Ниже приведен работающий пример, в котором используется массив целых чисел и показывается, как использовать некоторые из стандартных алгоритмов.

#include <iostream>
#include <algorithm>

// простая глобальная функция для использования
// с алгоритмом for_each
void Power(int value)
{
  std::cout << value*value << ",";
}

int main()
{
  int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] << ",";
  std::cout << std::endl;
  
  // перемешиваем элементы в массиве
  std::cout << "randomize" << std::endl;
  std::random_shuffle(array, array + 10);
  for(int i = 0; i < 10;++i)
    std::cout << array[i] << ",";
  std::cout << std::endl;
  
  // find возвращает итератор (в данном случае - указатель)
  // на элемент, если элемент найден и end(),
  // (последний элемент массива), если элемент не найден
  std::cout << "find" << std::endl;
  int* ptr = std::find(array, array + 10, 4);
  if(ptr == array + 10)
    std::cout << "not found" << std::endl;
  else
    std::cout << *ptr << " found" << std::endl;
  
  // меняем порядок элементов в массиве
  std::cout << "reverse" << std::endl;
  std::reverse(array, array + 10);
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] <<",";
  std::cout << std::endl;
  
  // сортировка
  std::cout << "sort" << std::endl;
  std::sort(array, array + 10);
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] <<",";
  std::cout << std::endl;
  
  // создаем копию массива
  std::cout << "copy" << std::endl;
  int another_array[10];
  std::copy(array, array + 10, another_array);
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] <<",";
  std::cout << std::endl;
  for(int i = 0; i < 10; ++i)
    std::cout<< another_array[i] <<",";
  std::cout << std::endl;
  
  // std::equal возвращает true,
  // если массивы абсолютно идентичны
  std::cout << "equality" << std::endl;
  if(std::equal(array, array + 10, another_array))
    std::cout << "the 2 arrays are equal" << std::endl;
  
  // std::fill заполняет массив указанным значением
  std::cout << "fill" << std::endl;
  std::fill(array, array + 10, 22);
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] << ",";
  std::cout << std::endl;
  
  // std::swap меняет элементы массива местами
  std::cout << "swap" <<std::endl;
  std::swap_ranges(array, array + 10, another_array);
  for(int i = 0; i < 10; ++i)
    std::cout << array[i] <<",";
  std::cout << std::endl;
  for(int i = 0; i < 10; ++i)
    std::cout << another_array[i] << ",";
  std::cout << std::endl;
  
  // std::count возвращает количество вхождений
  // элемента в массив 
  std::cout << "count" << std::endl;
  int count = std::count(another_array,
    another_array + 10, 22);
  std::cout << "there is "
            << count
            << " elements in new_array with value 22"
            << std::endl;
  
  std::cout << "for_each" << std::endl;
  std::for_each(array, array + 10, Power);
  
  return 0;
}

Вышеприведенный пример использует простой массив целых числе. Ну а как обстоят дела с массивами определенных пользователем типов?

Стандартные алгоритмы используют операторы '<', '==' и пр для сравнения двух элементов массива. Таким образом, вам необходимо определить операторы для ваших собственных типов. Ниже я создал структуру, содержащую два строковых (char) массива и определил оператор '<' для использования совместно с std::sort.

#include <iostream.h>
#include <algorithm>

struct MasterOfCpp
{
  char FirstName[16];
  char LastName[16];
};

bool operator < (const MasterOfCpp& lhs, const MasterOfCpp& rhs)
{
  return (strcmp(lhs.LastName, rhs.LastName) < 0)
      // ((strcmp(lhs.LastName, rhs.LastName) == 0)
          && (strcmp(lhs.FirstName, rhs.FirstName) < 0));
}

int main()
{
  MasterOfCpp moc[6];
  strcpy(moc[0].LastName,"Stroustrup");
  strcpy(moc[0].FirstName,"Bjarne");
  strcpy(moc[1].LastName,"Austern");
  strcpy(moc[1].FirstName,"Matt");
  strcpy(moc[2].LastName,"Meyers");
  strcpy(moc[2].FirstName,"Scott");
  strcpy(moc[3].LastName,"Josuttis");
  strcpy(moc[3].FirstName,"Nicolai");
  strcpy(moc[4].LastName,"Sutter");
  strcpy(moc[4].FirstName,"Herb");
  strcpy(moc[5].LastName,"Alexandrescu");
  strcpy(moc[5].FirstName,"Andrei");

  std::cout<< "array not sorted :" << std::endl;
  for (int i =0; i < 6; ++i)
      std::cout << moc[i].LastName
                << " " < <moc[i].FirstName
                << std::endl;
               
  std::cout << std::endl;
  
  std::cout << "array sorted :" << std::endl;
  std::sort(moc,moc+6);
  for (int i = 0; i < 6; ++i)
      std::cout << moc[i].LastName
                << " "<< moc[i].FirstName
                << std::endl;
  
  return 0;
}


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 15.03.2008 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office 365 Профессиональный Плюс. Подписка на 1 рабочее место на 1 год
Купить Антивирус Dr.Web Server Security Suite для сервера
IBM Domino Enterprise Server Processor Value Unit (PVU) Annual SW Subscription & Support Renewal
SAP Crystal Reports XI R2 Dev 2006 INTL WIN NUL License (Version 11)
Microsoft 365 Business Standard (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Программирование на Microsoft Access
CASE-технологии
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Реестр Windows. Секреты работы на компьютере
СУБД Oracle "с нуля"
Вопросы и ответы по MS SQL Server
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100