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