2013-03-01 18 views
21

私のコード内の現在の要素のインデックスは、取得:C++範囲ベース用ループ

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

は、このなんとかですか?または、私は古い学校のループのために行く必要がありますか?

+0

@MarkGarcia意味?私はそれが実行されると思うが、私はループの中で 'i'を得る方法が欠けている。 –

+0

@chris私は何かを意味するようにコードを編集しました。ベクトルに '0 ... n'を押すだけでは馬鹿です。私は条件式を持っています。 –

+1

ほぼ同じ:http://stackoverflow.com/questions/10962290/find-position-of-element-in-c11-range-based-for-loop – jogojapan

答えて

15

連続したストレージとstd::stringまたはその他のオブジェクトである:

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

ニース!私はベクトルが 'it - vector.begin()'のようなものを使うことができると思っていたので、あなたは私の問題を解決しました!ありがとう! –

+0

ありがとう!私は '&it - &vector [0]'をコンパイルしました。しかし、@ShaneHsuのコメントのような素晴らしい方法がありますか?私は、 'const initializer_list &it'のようなイテレータを使用して'&it - vector.begin() 'を使用しなければならないことを理解しました。しかし、 'for(const pair &it:vector_of_pairs)'のようなループでは、 'operator-'と一致しません(オペランドの型は 'const pair *'およびvector > :: const_iterator_どのようにしてイテレータのアドレスを得ることができますか?(前者はctorに、後者はconstメソッドにあります) – gr4nt3d

+0

基本ストレージがもはやベクトル型に変わった場合、それは中断します。おそらくあなたの整数ベースのセマンティクスはまた壊れてしまうでしょう...これはこれを行うことに対して強いポイントではありません。しかし、これを行うことで、連続したストレージへのコミットメントを強化するような気がします。 –

4

あなたが記述していることは、他の言語の「each with index」操作として知られています。簡単なグーグルグーグルをすると、 'old-school for loop'以外では、C++ 0x lambasやBoostの提供する宝石を含むかなり複雑なソリューションがあるようです。

EDIT:一例として、このquestion

5

範囲ループはあなたにインデックスを与えることはありません参照してください。これは、そのような概念を抽象化し、コレクションを繰り返し処理することを目的としています。

23

多分変数を持つだけで十分ですi

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

このようにして、範囲ベースのループを変更する必要はありません。

+1

これは解決策ですが、それは優雅ではありません。また、範囲ベースの伝統的なforループを実装しているので意味がないと思います。 –

+9

多分それはエレガントではないかもしれませんが、それは他の今後のすべての解決策/回避策のための基本的な複雑さ、可読性、オーバーヘッドなどです。 –

+8

確かに。しかし、私は実際にC++のRange-Based forループには常に一定の 'index'があるべきだと思います。 –

4

あなたはC++ 11でラムダを使用することができます。strと仮定すると

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

} 
+0

それは確かに複雑ですが、それは間違いなく学習価値があります!感謝!私はそれを徹底的に調べます。 –

+0

これは質問に答えません。 OPは、インスタンス自体ではなく、「b」のインスタンスの数値インデックスを必要としていました。 – mskfisher