50

我的代码如下:

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

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

4

6 回答 6

43

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

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

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

于 2013-03-01T02:29:36.680 回答
38

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

std::cin >> str;
for (char& c : str)
    if (c == 'b') v.push_back(&c - &str[0]);
于 2013-03-01T02:49:50.000 回答
9

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

于 2013-03-01T02:21:14.810 回答
6

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

编辑:作为一个例子,看到这个问题

于 2013-03-01T02:20:47.057 回答
4

您可以在 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;

}
于 2013-03-01T02:33:16.197 回答
2

在 C++ 20 中,我使用如下初始化器:

for(unsigned short i = 0; string item : nilai){
   cout << i << "." << "address " << &item << " -> " << item << endl;
   i++;
}

因此,您的情况将是:

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

我不知道在您的情况下“向量”是什么意思,什么是 push_back()。不要忘记添加-std=c++20(我只是使用g ++进行编译,所以我对其他编译器了解不多)。如果您愿意,也可以从 1 开始“i”值。我觉得够优雅

于 2022-02-20T03:53:17.237 回答