można użyć Boost.Range za indexed
adapter, który rozciąga się na iteratory Zakres jest z metodą index
który zwraca aktualny indeks (duh).
#include <boost/range/adaptor/indexed.hpp>
// ...
auto&& r = vec | boost::adaptors::indexed(0);
for(auto it(begin(r)), ite(end(r)); it != ite; ++it)
std::cout << it.index() << ": " << *it << "\n";
Niestety, ponieważ index
to metoda na iteracyjnej część, oznacza to, że nie można korzystać z nowa gama opartych na pętli lub nawet BOOST_FOREACH
, który tylko daje dostęp do elementu. Oto raczej boilerplate-y obejście o wątpliwej wartości:
// note: likely contains typos or bugs
#include <boost/range/adaptors.hpp>
template<class IndexIt>
auto pair_index_value(IndexIt it)
-> std::pair<std::size_t, decltype(*it)>
{
return std::pair<std::size_t, decltype(*it)>(it.index(), *it);
}
// ...
using namespace boost::adaptors;
auto&& ir = vec | indexed; // because screw you Boost.Range
for(auto&& elem : boost::counting_range(ir.begin(), ir.end()) | transformed(pair_index_value))
std::cout << elem.first << ": " << elem.second << "\n";
Jeśli potrzeba * * indeks jakiegoś wewnętrznej, podstawowego powodu, a następnie użyć drugą wersję. –
C++ nie ma "wyliczenia" – Fanael
Tak, wolę drugie, jeśli potrzebujesz indeksu. –