C++ 获取C+中当前元素的索引+;基于距离的for循环

C++ 获取C+中当前元素的索引+;基于距离的for循环,c++,for-loop,c++11,iteration,C++,For Loop,C++11,Iteration,我的代码如下: std::cin >> str; for ( char c : str ) if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str 这可行吗?否则,我将不得不使用老式的for循环?您所描述的在其他语言中称为“each with index”操作。进行一些快速的谷歌搜索,似乎除了“老派的循环”之外,您还有一些相当复杂的解决方案,包括C++0x lambas或一些Boost提供

我的代码如下:

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

这可行吗?否则,我将不得不使用老式的for循环?

您所描述的在其他语言中称为“each with index”操作。进行一些快速的谷歌搜索,似乎除了“老派的循环”之外,您还有一些相当复杂的解决方案,包括C++0x lambas或一些Boost提供的gems


编辑:例如,请参见此

范围循环不会为您提供索引。它旨在抽象出这些概念,并让您在集合中进行迭代。

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

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

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

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

#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;

}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
std::字符串str;
std::向量v;
自动插入器=标准::返回插入迭代器(v);
std::cin>>str;
//如果您不想从输入中读取
//str=“aaaaa bcdeccccddbb”;
std::copy_if(str.begin(),str.end(),inserter,[](const char c){return c=='b';});
std::copy(v.begin()、v.end()、std::ostream_迭代器(std::cout,“,”);

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

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

这是一个解决方案,但它并不优雅。另外,我认为它将毫无意义,因为它在基于范围的循环中实现传统的for循环。也许它并不优雅,但它是所有其他即将推出的解决方案/解决方案的基线wrt复杂性、可读性、开销等。当然。但我真的认为C中应该有一个常量
index
++基于范围的for循环。您询问了当前的语言状态,其中不存在类似
index
的内容。是否以及如何扩展该语言是一个不同的问题,不属于此处。其中的一个问题是i变量的作用域位于循环之外。对于传统的for,您可以声明所有类型相同的额外变量(作为主“循环变量”)。它看起来确实很复杂,但绝对值得学习!谢谢!我会研究它。这并不能回答问题。OP想要的是“b”实例的数字索引,而不是实例本身。几乎相同:也相关:很好!我想向量可以使用类似于
It-vector.begin()的东西
,你解决了我的问题!谢谢!谢谢!我得到了
&it-&vector[0]
来编译。但是有没有像@ShaneHsu的评论这样的好方法呢?我想,我必须使用
&it-vector.begin()
来使用迭代器,比如
常量初始值设定项列表&it
。然而,在一个循环中,比如
for(const pair&it:vector\u of pairs)
这会产生一个错误:“operator-”不匹配(操作数类型为“const pair*”和vector::const_iterator。如何获取迭代器的地址?(请注意,前者位于ctor中,后者位于const方法中)请注意,如果基础存储更改为不再是向量类型,它将中断。可能基于整数的语义也会中断…因此,这不是反对这样做的一个优点。但是,这样做确实会让您感觉到您将加强对连续存储的承诺。@gr4nt3d您的问题似乎是如何不能B从迭代器中获得关联类型的排序(比如说它是一个哈希表)几乎没有排序,你只能做一些事情,比如检查它与
container.end()
,或者获取下一个,等等。请看@StevenLu,我不明白你的意思;我指的是纯
std::vector
(至少从评论中可以看出,因为从那时起已经有相当长的一段时间了)。因此,它将具有我需要的顺序,但显然表达式
&it-vector\u of_pairs.begin()
不起作用,即使我希望指针算法能起作用,因为它是连续存储的。但是,我再也记不起确切的情况了。