【问题标题】:Get index of current element in C++ range-based for-loop在基于 C++ 范围的 for 循环中获取当前元素的索引
【发布时间】:2013-02-15 11:01:53
【问题描述】:

我的代码如下:

std::cin >> str;
for ( char c : str )
    if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str

这可行吗?或者我将不得不使用老式的 for 循环?

【问题讨论】:

标签: c++ for-loop c++11 iteration


【解决方案1】:

您可以在 c++11 中使用 lambda:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>

using namespace std;


int main() {
    std::string str;
    std::vector<char> v;
    auto inserter = std::back_insert_iterator<decltype(v)>(v);

    std::cin >> str;
    //If you don't want to read from input
    //str = "aaaaabcdecccccddddbb";

    std::copy_if(str.begin(), str.end(), inserter, [](const char c){return c == 'b';});

    std::copy(v.begin(),v.end(),std::ostream_iterator<char>(std::cout,","));

    std::cout << "Done" << std::endl;

}

【讨论】:

  • 确实看起来很复杂,但绝对值得学习!谢谢!我会调查的。
  • 这没有回答问题。 OP 想要 'b' 实例的数字索引,而不是实例本身。
【解决方案2】:

假设strstd::string 或其他具有连续存储的对象:

std::cin >> str;
for (char& c : str)
    if (c == 'b') v.push_back(&c - &str[0]);

【讨论】:

  • 不错!我在想向量可以使用it - vector.begin()之类的东西,你解决了我的问题!谢谢!
  • 谢谢!我得到了&amp;it - &amp;vector[0] 来编译。但是有没有像@ShaneHsu 的评论这样的好方法?我想通了,我必须使用 &amp;it - vector.begin() 使用迭代器,例如 const initializer_list&lt;double&gt;&amp; it。然而,在for(const pair&lt;double, int&gt;&amp; it : vector_of_pairs) 这样的循环中,这会产生错误:no match for 'operator-'(操作数类型是 'const pair*' 和 vector >: :const_iterator . 如何获取迭代器的地址?(注意前者在ctor中,而后者在const方法中)
  • 请注意,如果底层存储变为不再是向量类型,它将中断。很可能你的基于整数的语义也会中断......所以这不是反对这样做的强项。但这样做确实会让您更加坚定对连续存储的承诺。
  • @gr4nt3d 你的问题似乎是关于你如何无法从关联类型的迭代器中获得排序,它(说它是一个哈希表)几乎 没有排序 , 你只能做一些事情,比如检查它与container.end()的相等性,或者获取下一个,等等。见stackoverflow.com/a/43680932/340947
  • @StevenLu,我不明白你的意思;我指的是普通的std::vector(至少从评论中可以看出,因为从那时起已经有一段时间了)。因此,它将具有我需要的顺序,但显然表达式 &amp;it - vector_of_pairs.begin() 不起作用,即使我希望指针算法能够工作,因为它是连续存储的。但是,我已经记不起确切的情况了。
【解决方案3】:

也许有一个变量i就足够了?

unsigned i = 0;
for ( char c : str ) {
  if ( c == 'b' ) vector.push_back(i);
  ++i;
}

这样您就不必更改基于范围的循环。

【讨论】:

  • 这是一个解决方案,但并不优雅。另外,我认为这将毫无意义,因为它在基于范围的循环中实现了传统的 for 循环。
  • 也许它并不优雅,但它是所有其他即将推出的解决方案/变通方案的复杂性、可读性、开销等的基线。
  • 当然。但我真的认为在 C++ Range-Based for 循环中应该有一个常量index
  • 您询问了当前的语言状态,其中不存在 index 之类的内容。语言是否可以扩展以及如何扩展是一个不同的问题,不属于这里。
  • 这有一个问题 - i 变量的范围在循环之外。在传统 for 的情况下,您可以在一个地方声明额外的变量,当它们都是相同类型时(作为您的主“循环变量”)。
【解决方案4】:

范围循环不会给你索引。它旨在抽象出这些概念,并让您遍历集合。

【讨论】:

    【解决方案5】:

    您所描述的在其他语言中被称为“每个都有索引”操作。进行一些快速的谷歌搜索,似乎除了“老派 for 循环”之外,您还有一些相当复杂的解决方案,涉及 C++0x 兰巴或可能一些 Boost 提供的 gem。

    编辑:例如,请参阅question

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 2012-04-29
      • 2012-06-13
      • 2021-05-23
      • 1970-01-01
      • 2013-01-04
      • 2021-10-30
      • 2016-10-31
      • 2013-10-03
      相关资源
      最近更新 更多