einen Wrapper erstellen, für die beginnen() und end() geben die richtigen Iteratoren zurück, und dann können Sie das als zweites Argument verwenden.
#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;
}
Beachten Sie, dass mein fromNth „begin“ ist nicht definiertes Verhalten, wenn die Größe des Eingangs kleiner als der Offset ist. (Wenn es gleich ist, ist es gut definiert und beginnt == Ende). Führen Sie daher zuerst eine Größenprüfung durch.
Hinweis: Wenn Sie eine ausreichend aktuelle Boost-Version verwenden, kann Ihnen iterator_range
bereits eine solche "Sammlung" bereitstellen, die meinem "FromNth" ähnlich ist.
for(auto const& s : boost::make_iterator_range(v.begin() + 1, v.end()))
{
process(s);
}
Hinweis: Der Code oben gearbeitet CodingGround C++ 11 GNU 4.8.3 verwenden. (Diese Seite ist allerdings sehr langsam). Ab C++ 14 werden Sie die Anweisungen -> declltype (die in C++ 11 für Vorlagen benötigt werden) nicht benötigen.
Output:
sh-4.3$ g++ -std=c++11 -o main *.cpp
sh-4.3$ main
3
5
7
11
13
17
19
23
Eine Möglichkeit ist es, einen neuen Vektor mit den notwendigen Elementen zu machen, und dann durch die Schleife. Oder Sie können 'std :: for_each' verwenden: http://en.cppreference.com/w/cpp/algorithm/for_each – CinCout
Sie können nicht. Die bereichsbasierte Schleife ist nicht die Lösung für jedes Problem. Verwenden Sie einfach eine normale Schleife. –
Wie von @GargAnkit erwähnt, können Sie einen neuen Vektor mit erforderlichen Elementen erstellen. Sie können dies als Teil der Schleifendeklaration mithilfe des Vektorkonstruktors tun. Also 'für (auto &&i: std :: vector (v.begin() + 1, v.end())). Demo [hier] (http://ideone.com/G9yfjx). Nicht so sauber wie das Python-Beispiel, das du gezeigt hast. –
Ralara