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ではラムダを使用できます。

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

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

于 2022-02-20T03:53:17.237 に答える