Возможно ли в C ++ последовательно выполнять несколько итераторов в одном цикле? - PullRequest
0 голосов
/ 08 ноября 2019

Я знаю, что если я использую контейнер c ++, который реализует интерфейс iterator (предоставляет функции begin() и end()), я могу использовать цикл for, подобный этому, для итерации по нему:

for (auto element : container) {
    process(element);
}

Если у меня два экземпляра одного и того же типа контейнера, я могу написать такой код

for (auto element : container1) {
    process(element);
}
for (auto element : container2) {
    process(element);
}

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

for (auto element : container1 + container2) {
    process(element);
}

Я знаю, что могу использовать такие вещи, как container1.insert(container1.end(), container2.begin(), container2.end());, чтобы объединить их, если они окажутся векторами, но я хочу сделать это более широко, на месте, содна строка, без изменения любого контейнера.

1 Ответ

2 голосов
/ 08 ноября 2019

Не используя какой-либо адаптер итератора, вы можете просто создать массив указателей / ссылок на все контейнеры, а затем выполнить цикл по нему, выполнив внутренний цикл для итерации элементов текущего контейнера:

auto* containers[] = {&container1, &container2};
for (auto *container : containers) {
    for (auto &element : *container) {
        process(element);
    }
}
...