2016-07-07 12 views
-4

ベクトルのマップを反復しようとすると、奇妙なエラーが発生します。私はこのプロジェクトにスタンフォードCS106Bクラスライブラリを使用しています。コードをコンパイルしようとすると、「itrには「first」という名前のメンバーはありません」というメッセージが表示されます。ベクトルのマップを反復する

私はこの問題の解決方法を探しました私は多くの同様のエントリを見つけましたが、答えは私がやっていることを模倣するようです。私は何か簡単なものが欠けていると確信しています...

#include <iostream> 
#include <fstream> 
#include <string> 
#include "console.h" 
#include "simpio.h" // for getLine 
#include "strlib.h" 
#include "vector.h" 
#include "queue.h" 
#include "map.h" 
#include <iterator> 
using namespace std; 

void CountLetters(ifstream &filename) { 
    int index=0; 
    Vector<int> counts; 
    for (int i=0; i<=26; i++) { 
     counts.add(0); 
    } 
    char c; 
    while (!filename.eof()) { 
     c=filename.get(); 
     index=c-'a'; 
     if (index>=0 && index<26) { 
      c=stringToChar(toLowerCase(charToString(c))); 
      counts[index]++; 
     } 
    } 
    for (int y=0; y<=26; y++) { 
     cout << char('a'+y) << ": " << counts[y] << endl; 
    } 
    filename.close(); 
} 

Map <string, Vector<char> > assembleSets (ifstream &in, int seed) { 
    Map <string, Vector<char> > letterSets; 
    char c; 
    Vector<char> workingText; 
    string letterSet; 
    while(!in.eof()) { 
     if (workingText.size()<seed) { // Build the intial set of "seed" letters. 
      c=in.get(); 
      workingText.add(c); 
     } 
     else { 
      c=in.get(); 
      letterSet.clear(); 
      for (int i=0; i<workingText.size()-1; i++) { 
       letterSet+=workingText[i]; // add the letter to the letter set. 
       workingText[i]=workingText[i+1]; // move the letter down one in the vector (simulate queue). 
      } 
      letterSet+=workingText[seed-1]; 
      workingText[seed-1]=c; // add the newwest letter to the workingText but do not add it to the letter set. 

      // Check to see if the letter set exists already, if not, add it. 
      if (!letterSets.containsKey(letterSet)) { 
       Vector<char> blank; 
       letterSets.add(letterSet,blank); 
       letterSets[letterSet].add(c); 
      } 
      else { 
      // Add the next character to the vector of characters for that letter set. 
      letterSets[letterSet].add(c); 
      } 
     } 
    } 
    return letterSets; 
} 

int main() { 
    ifstream in; 
    int mSeed =0; 


    while (true) { 
     string fileName = getLine("Please enter a file name"); 

     in.open(fileName); 
     if(in.fail()) cout << "Couldn't open file!" << endl; 
     else break; 
    } 
    // CountLetters(in); 



    while (true) { 
     mSeed=getInteger("Enter a seed value: "); 
     if (mSeed>0&&mSeed<=10) { 
      break; 
     } else { 
      cout << "Please choose a value from 1 to 10." << endl; 
     } 
    } 

    Map<string, Vector<char> > letterSets = assembleSets(in, mSeed); 
    Map<string, Vector<char> > :: iterator itr; 

    for (auto& it: letterSets) { 
     string keys = (it.first); 
     Vector<char> values = it.second; 
    } 
    return 0; 
} 

何か助けが素晴らしいでしょう!私は本当に頭を掻いている。

+0

実際 'Map'は何ですか? –

+2

宿題のような匂い? https://communitystandards.stanford.edu/student-conduct-process/honor-code-and-fundamental-standard – Pogrindis

+0

これは確かですが、iTunes Uの無料コースです。私は趣味としてオブジェクト指向プログラミングを学ぶ構造エンジニアです。 – Eeets

答えて

0

これは単にMap<string, Vector<char> > :: iteratorを意味します。 Vectorの代わりにMapstd::vectorの代わりにstd::mapを使用すると正しくコンパイルされます。

カスタムイテレータの実装を確認してください。 (あなたがC++標準ライブラリを使用している場合)

とにかく私はあなたがこのために範囲ベースの構文を使用することをお勧め:

for (auto& it : letterSets) 
{ 
    string key = it.first; 
    vector<char> values = it.second; 
} 
+0

私は提案を感謝します。私がコード例と一緒に従おうとしているので、私ができるならばクラスライブラリを使うことを好むでしょう。スタンフォードヘッダは、使いやすさのために.add()のような関数を持っています。私はあなたが示唆したようにコードを変更しようとしましたが、stdの代わりにMapおよびVectorを使用しています。まだ運がない...同じエラー。インクルードステートメントに何か不足している可能性はありますか? – Eeets

+0

ドキュメントをよく確認してください。コードが表示されなくても問題は解決できません。 –

+0

@Eeets - あなたの質問と究極の答えは、これらのクラスの中にある 'iter'に依存しています。あなたは私たちにこれを見せてくれませんでした。私たちが持つ唯一のことは、あなたのクラスを標準クラスと比較することです。この答えが示すように、マップの標準イテレータクラスは正しく動作します。 – PaulMcKenzie

関連する問題