2

ベクトルのマルチセットから各ベクトルのすべての要素を出力しようとしています。ビルドは失敗していますが、ヘッダー ファイルのどこかでエラーが発生しています。エラー コードがまったくわかりません。どんな助けでも大歓迎です!エラーは次のとおりです。

error: invalid conversion from 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >* const' to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >*'

そして、これが問題の原因となっているコードです。

multiset<vector < string > > setOfRules;
vector<string> testing,testing2;

testing.push_back("bar");
testing.push_back("foo");
testing2.push_back("foo2");
testing2.push_back("bar2");
setOfRules.insert(testing);
setOfRules.insert(testing2);

for (multiset< vector <string > >::iterator myIterator = setOfRules.begin();
     myIterator!=setOfRules.end(); 
     ++myIterator) 
{

    for (vector< string >::iterator myOtherIterator = ( *myIterator ).begin(); 
         myOtherIterator != ( *myIterator ).end(); 
         ++myOtherIterator) 
    {
        cout << *myOtherIterator << " " ;
    }
    cout << endl;
}
4

3 に答える 3

6

C++11 Standard は、値の型がキーの型と同じである連想コンテナーの場合、 iteratorと const_iteratorの両方が定数反復子であると主張しています。

実際にそうmultiset<vector<string>>::iteratorですconst_iterator。イテレータと同じトリックstd::set- それらはすべて const です。

これは、constオブジェクト ( which is で指定) から非 constイテレータをvector<string>::iterator myOtherIterator = *myIterator.begin()取得しようとするため、ステートメントが失敗することを意味します。*myIteratorconst

修正するには、次を使用する必要がありますvector<string>::const_iterator

for(multiset<vector<string>>::const_iterator myIterator = setOfRules.begin(); 
    myIterator != setOfRules.end(); ++myIterator)
{
   for(vector<string>::const_iterator myOtherIterator = *myIterator.begin();     
      myOtherIterator != *myIterator.end(); ++myOtherIterator)
   {
      cout << *myOtherIterator << " ";
   }
   cout << endl;
}
于 2012-09-10T20:24:23.417 に答える
1

私の推測では、知っておく必要のあるすべてのコードが表示されていないため、間違ったイテレータタイプを使用しているという推測にすぎません。オブジェクトが一定であるため、const_iteratorを使用する必要があることがコンパイラの嘔吐に基づいて表示されます。

連想コンテナ(マルチセットなど)の重要な部分に割り当てることはできません。これは、ベクトルがconstであることを意味します。それを繰り返すには、constイテレータが必要です。

マルチセットは非定数のようです。ナビゲートするのに定数イテレータは必要ありません。含まれる値型のconstの性質により、キーへの割り当てが防止されます。

于 2012-09-10T20:01:34.967 に答える
1

プレーンを持つのmultiset<XXX>::iterator myIteratorは間違っています。これを行うと *myIterator = ...;、マルチセットが壊れてしまうからです。

const_iterator代わりに使用

for (multiset< vector <string > >::const_iterator myIterator = setOfRules.begin(); myIterator!=setOfRules.end(); ++myIterator) {
于 2012-09-10T20:10:08.250 に答える