Создать оболочку, для которой начать() и end() возвращают правильные итераторы, а затем вы можете использовать это как второй аргумент.
#include <iostream>
#include <vector>
template< typename Collection >
class FromNth
{
Collection& coll_;
size_t offset_;
public:
FromNth(Collection& coll, size_t offset)
: coll_(coll), offset_(offset)
{
}
// will nicely resolve to const_iterator if necessary
auto begin() const -> decltype(coll_.begin())
{ return coll_.begin() + offset_; }
auto end() const -> decltype(coll_.end())
{ return coll_.end(); }
};
template< typename Collection >
FromNth<Collection> makeFromNth(Collection& collection, size_t offset)
{
return FromNth<Collection>(collection, offset);
}
template< typename Collection >
auto begin(const FromNth<Collection> & wrapper) -> decltype(wrapper.begin())
{
return wrapper.begin();
}
template< typename Collection >
auto end(const FromNth<Collection> & wrapper) -> decltype(wrapper.end())
{
return wrapper.end();
}
int main()
{
std::vector<int> coll { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
for(auto x : makeFromNth(coll, 1))
{
std::cout << x << '\n';
}
return 0;
}
Обратите внимание, что мой fromNth «начать» не определено поведение, если размер входных данных меньше, чем смещение. (Если он равен, то он хорошо определен и начинается == end). Поэтому сначала выполните проверку размера.
Примечание: если вы используете достаточно новую версию повышения, то iterator_range
может уже предоставить вам такую «коллекцию», которая похожа на мою «FromNth».
for(auto const& s : boost::make_iterator_range(v.begin() + 1, v.end()))
{
process(s);
}
Примечание: Приведенный выше код работает на CodingGround с помощью C++ 11 GNU 4.8.3. (Этот сайт очень медленный, хотя). Из C++ 14 вам не понадобятся инструкции -> decltype (которые необходимы в C++ 11 для шаблонов).
Выход:
sh-4.3$ g++ -std=c++11 -o main *.cpp
sh-4.3$ main
3
5
7
11
13
17
19
23
Один из способов сделать новый вектор с необходимыми элементами, а затем перебрать. Или вы можете использовать 'std :: for_each': http://en.cppreference.com/w/cpp/algorithm/for_each – CinCout
Вы не можете. Цикл на основе диапазона не является решением для каждой проблемы. Просто используйте обычный цикл. –
Как уже упоминалось @GargAnkit, вы можете создать новый вектор с требуемыми элементами. Вы можете сделать это как часть объявления цикла с помощью векторного конструктора. Итак 'for (auto && i: std :: vector (v.begin() + 1, v.end()))'. Демо [здесь] (http://ideone.com/G9yfjx). Не такой аккуратный, как пример python, который вы показали. –
Ralara