gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:49:03 25 4
gpt4 key购买 nike

我有一个std::vector<std::string> v;(已初始化)。如何使用range-for循环访问除第一个元素(索引为零)以外的所有元素。对于所有元素:

for (const string & s: v)
process(s);

可以使用范围表达式来代替 v如何编写范围表达式以跳过第一个元素(或跳过前n个元素)

我知道如何使用 v.begin() + 1和经典循环来获得效果。我正在寻找新的,更易读的,推荐的替代方法。可能类似于Python切片吗? ...喜欢:
for s in v[1:]:
process(s)

最佳答案

创建一个包装器,针对该包装器,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;
}

请注意,如果输入的大小小于偏移量,则我的fromNth“begin”是未定义的行为。 (如果相等,则定义明确并开始== end)。因此,请先进行尺寸检查。

注意:如果您使用的是最新版本的boost,那么 iterator_range可能已经为您提供了一个类似于我的“FromNth”的“集合”。
for( auto const& s : boost::make_iterator_range( v.begin() + 1, v.end() ) )
{
process( s );
}

注意:上面的代码使用C++ 11 GNU 4.8.3在 CodingGround上工作。 (尽管该站点非常慢)。从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

关于C++ 11:第二个元素的范围循环矢量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31936787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com