Стандартні алгоритми та масиви C + + (исходники), Різне, Програмування, статті

Ви ніколи не думали про те, що було б просто чудово, якщо б ви могли використовувати стандартні алгоритми з масивами мови 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;
}


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*