【问题标题】:Is it possible to define 'step' size when iterating over a C++ container? [duplicate]迭代 C++ 容器时是否可以定义“步长”大小? [复制]
【发布时间】:2021-01-27 20:45:54
【问题描述】:

我知道迭代字符串的每个字符的简单方法,例如:

std::string some_string("Hello World");
for(auto character : some_string)
    std::cout << character << std::endl;

但是有没有办法使用这种结构来告诉它采取措施,或者以这种方式采取特定长度的容器?或者我是否必须使用经典的int i = 0; i &lt; some_string.length(); i+=2 构造来迭代字符串索引并使用string.substr() 存储部分索引?例如,如果我想将字符串的每 2 个字符存储为子字符串。

【问题讨论】:

  • 不,这是不可能的。你需要一个使用迭代器的 for 循环,或者一个索引循环。
  • 简单易读的代码 > 一些看起来很酷的 hacky 技巧。
  • @JackAvante -- boost 库有stride iterators。也许在 C++ 23 或更高版本中,它们可以被标准委员会采用。
  • views::stride(n) from ranges-v3 可以做到这一点 (for (auto character : some_string | views::stride(2)))。还有boost::adaptors::strided(n),语法类似
  • @Artyer 你应该发布views::stride() 作为两者的答案,我想说,因为range-v3 是标准范围的基础,因此stdlib 将得到一个很好的改变stride()未来。

标签: c++ loops iteration


【解决方案1】:

此范围基于 for 循环(来自 cppreference):

for ( init-statement(optional)range_declaration : range_expression ) loop_statement 

相当于:

{

    init-statement
    auto && __range = range_expression ;
    auto __begin = begin_expr ;
    auto __end = end_expr ;
    for ( ; __begin != __end; ++__begin) {

        range_declaration = *__begin;
        loop_statement

    }

} 

(查看链接了解begin_exprend_expr 是什么以及更多详细信息)

没有(简单的)方法可以使它增加超过一。基于范围的 for 循环的优点是您不需要关心索引或迭代器。如果你想对索引做一些事情,那么使用基于范围的循环并不是一个优势。

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2019-12-24
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多