Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

8.4 Цикл for по коллекции

Во многих языках программирования существует конструкция для сокращения количества кода, требуемого для перебора элементов коллекции − for_each. В стандарте С++11 появилась возможность писать более компактный код за счет появления цикла for по коллекции.

Пример использования конструкции выглядит следующим образом.

// Пример 8.13 - цикл for по коллекции для статического массива

int arr[] = {1,2,3,4,5};

for(int &v: arr)

std::cout << v << ' ';

std::cout << std::endl;

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

// Пример 8.14 - цикл for по коллекции для контейнера std::vector

std::vector<int> vec = {1,2,3,4,5,6,7,8,9,10};

for(auto v: vec)

std::cout << v << ' ';

std::cout << std::endl;

Результат работы программы следующий:

1 2 3 4 5 6 7 8 9 10

Аналогичный пример для ассоциативного массива:

// Пример 8.15 - цикл for по коллекции для контейнера std::map

std::map<std::string, int> personAge = {

{"Ivan", 20},

{"Anton", 25},

{"Michail", 27}

};

for(auto v: personAge)

std::cout << v.first << " - " << v.second << '\n';

Результат работы программы следующий:

Anton - 25

Ivan - 20

Michail - 27

Цикл for по коллекции может быть применен для обхода элементов пользовательских классов-коллекций. Для этого необходимо, чтобы новый класс имел два метода: begin() и end(). Метод begin() возвращает итератор на первый элемент. Метод end() возвращает итератор на элемент, следующий за последним.

В следующем примере класс MyCollection имеет вложенный класс iterator, экземпляры которого возвращаются методами MyCollection::begin() и MyCollection::end(). У итератора есть три перегруженных оператора: звездочка (*), инкремент (++), не равно (!=).

// Пример 8.16 - цикл for по коллекции для пользовательского класса

class MyCollection

{

std::vector<int> mVec;

public:

class iterator

{

int mIndex;

MyCollection& mCollection;

public:

iterator(MyCollection& collection, int index) :

mCollection(collection), mIndex(index) {}

int operator*() { return mCollection.at(mIndex); }

bool operator!=(const iterator& it) {

return mIndex != it.mIndex; }

void operator++() { ++mIndex; }

};

MyCollection(std::initializer_list<int> list){ mVec = list; }

MyCollection(std::initializer_list<std::initializer_list<int>> list) {

for(auto l: list)

mVec.insert(mVec.end(), l);

}

iterator begin() { return iterator(*this, 0); }

iterator end() { return iterator(*this, mVec.size()); }

int at(int index) { return mVec.at(index); }

};

int main()

{

MyCollection mc({1,2,3,4,5});

for(int it: mc)

std::cout << it << ' ';

std::cout << std::endl;

MyCollection mc2({{1,2,3},{4,5,6},{7,8,9}});

for(int it: mc2)

std::cout << it << ' ';

std::cout << std::endl;

return 0;

}

Результат работы программы следующий:

1 2 3 4 5

1 2 3 4 5 6 7 8 9

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]