Вы должны иметь возможность перебирать индексы , а не элементы . Я думаю, что C ++ 20 std::ranges
дает вам простой способ сделать это, или вы можете использовать один из методов Boost range
. Я не уверен, почему вы могли бы подумать о том, чтобы использовать дух Boost counting_range
, когда вы могли бы просто использовать Boost: -)
Сказав это, я фактически выбрал этот индивидуальный подход, просто чтобы сделать код самодостаточным без C ++ 20 и Boost: не стесняйтесь заменять paxrange
одним из других методов в зависимости от ваши потребности:
#include <iostream>
#include <algorithm>
// Seriously, just use Boost :-)
class paxrange {
public:
class iterator {
friend class paxrange;
public:
long int operator *() const { return value; }
const iterator &operator ++() { ++value; return *this; }
iterator operator ++(int) { iterator copy(*this); ++value; return copy; }
bool operator ==(const iterator &other) const { return value == other.value; }
bool operator !=(const iterator &other) const { return value != other.value; }
protected:
iterator(long int start) : value (start) { }
private:
unsigned long value;
};
iterator begin() const { return beginVal; }
iterator end() const { return endVal; }
paxrange(long int begin, long int end) : beginVal(begin), endVal(end) {}
private:
iterator beginVal;
iterator endVal;
};
int main() {
// Create a source and destination collection.
std::vector<int> s;
s.push_back(42); s.push_back(77); s.push_back(144);
s.push_back(12); s.push_back(6);
std::vector<int> d(5);
// Shows how to use indexes with multiple collections sharing index.
auto process = [s, &d](const int idx) { d[idx] = s[idx] + idx; };
paxrange x(0, d.size());
std::for_each(x.begin(), x.end(), process); // add parallelism later.
// Debug output.
for (const auto &item: s) std::cout << "< " << item << '\n';
std::cout << "=====\n";
for (const auto &item: d) std::cout << "> " << item << '\n';
}
«Основой» решения являются три строки в середине main()
, где вы настраиваете функцию для обратных вызовов, которая принимает индекс, а не сам элемент.
Внутри этой функции вы используете этот индекс плюс столько коллекций, сколько необходимо, чтобы настроить целевую коллекцию, очень похожую на то, что вы хотите.
В моем случае я просто хотел, чтобы выходной вектор был входным вектором, но с индексом, добавленным к каждому элементу, в соответствии с выходом:
< 42
< 77
< 144
< 12
< 6
=====
> 42
> 78
> 146
> 15
> 10