C++11 C++;11:第二个元素的范围循环向量?

C++11 C++;11:第二个元素的范围循环向量?,c++11,for-loop,stdvector,C++11,For Loop,Stdvector,我有一个std::vector v(已初始化)。如何使用循环范围访问除第一个元素(索引为零)之外的所有元素。对于所有元素: for (const string & s: v) process(s); 可以使用范围表达式代替v如何编写范围表达式以跳过第一个元素(或跳过前n个元素)? 我知道如何使用v.begin()+1和经典循环获得效果。我正在寻找新的、更具可读性的、推荐的替代方法。可能是类似于Python切片的东西。。。比如: for s in v[1:]: proce

我有一个
std::vector v(已初始化)。如何使用循环范围访问除第一个元素(索引为零)之外的所有元素。对于所有元素:

for (const string & s: v)
    process(s);
可以使用范围表达式代替
v
如何编写范围表达式以跳过第一个元素(或跳过前n个元素)

我知道如何使用
v.begin()+1
和经典循环获得效果。我正在寻找新的、更具可读性的、推荐的替代方法。可能是类似于Python切片的东西。。。比如:

for s in v[1:]:
    process(s)

直到范围进入标准库,在C++中,你不会得到比香草为好的:

for(auto i = begin(v) + 1, e = end(v); i !=e; ++i)
    // Do something with *i

创建一个包装器,begin()和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;
}
注意:上面的代码是使用C++11GNU4.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
:你不能。基于范围的循环并不是每个问题的解决方案。只需使用一个普通的循环。正如@GargAnkit所提到的,您可以使用所需的元素创建一个新的向量。您可以使用向量构造函数作为循环声明的一部分来执行此操作。所以
for(auto&&i:std::vector(v.begin()+1,v.end())
。演示。不像你所展示的Python例子那样整洁。看看哪一个有好的模板来解决这个问题。@ CashCow,问题是把一个范围弯曲成形状,我假设是纯C++。我已经看到了足够多的提升,知道如果你向它扔足够多的模板,没有什么是不可能的;)@我会回来的时候,C++的范围。*邪恶的笑声*@Quentin:好吧,你不应该像你的偶像那样嚼韭菜(除非你真的那么蓝)。这让你太邪恶了(就像一些素食者一样)顺便说一句,我喜欢你的例子中的++I。许多程序员都会编写i++.@pepr高级韭菜咀嚼蓝。。。UH事情,知道如何增加他们的迭代器!是的,我很困惑:))谢谢你的信息!我原以为已经有这样的std代码了(但我找不到);)
sh-4.3$ g++ -std=c++11 -o main *.cpp
sh-4.3$ main
3
5
7
11
13
17
19
23