我的代码如下:
std::cin >> str;
for ( char c : str )
if ( c == 'b' ) vector.push_back(i) //while i is the index of c in str
这是可行的吗?或者我将不得不使用老式的 for 循环?
也许有一个变量就足够了i
?
unsigned i = 0;
for ( char c : str ) {
if ( c == 'b' ) vector.push_back(i);
++i;
}
这样您就不必更改基于范围的循环。
假设str
是一个std::string
或其他具有连续存储的对象:
std::cin >> str;
for (char& c : str)
if (c == 'b') v.push_back(&c - &str[0]);
范围循环不会给你索引。它旨在抽象出这些概念,并让您遍历集合。
您所描述的在其他语言中被称为“每个都有索引”操作。进行一些快速的谷歌搜索,似乎除了“老派 for 循环”之外,您还有一些相当复杂的解决方案,涉及 C++0x 兰巴或可能一些 Boost 提供的宝石。
编辑:作为一个例子,看到这个问题
您可以在 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;
}
在 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”值。我觉得够优雅