私のコードは次のとおりです。
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ではラムダを使用できます。
#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;
}
あなたの場合、「vector」が何を意味するのか、push_back()とは何なのかわかりません。追加することを忘れないでください-std=c++20
(私はコンパイルにg ++を使用しているので、他のコンパイラについてはあまり知りません)。必要に応じて、「i」の値を1から開始することもできます。十分エレガントだと思います