2016-05-12 3 views
0

このコードでは、レプラコーンでいっぱいのマップを反復処理しなければならず、i = 0,1,2から厳密な順序で処理する必要があります。 ... 私は私のコードを実行するたびに、私はそれが増加可能ではないことを示すエラーが発生し続ける。私はこのエラーで他の投稿をチェックしましたが、すべての質問者が最初から地図を開始することをお勧めしています。あなたの誰かがこれを回避することを知っているかどうか、私は疑問に思っていました。また、マップベースのデータ構造を使用してバイナリ検索ツリーやマップ構造を使用する必要があります。私はどのようなヒント、コメント、ヒント、またはヘルプにも非常に感謝します。イテレータをインクリメントできないため、最初からマップを再起動できません

#include <iostream> 
#include <chrono> 
#include <random> 
#include <map> 
#include <vector> 

using namespace std; 


class RandomNumberGenerator { 
public: 
    RandomNumberGenerator(int x) :generator(x) {}; 
// return a double between -1 and 1 
double randomBetween1and2() { 
    return (2.0*generator())/generator.max() - 1.0; 
} 
private: 
minstd_rand0 generator; 
}; 


int N; 
// Use a constant random number seed so behavior is consistent from run to run. 
int RANDOM_SEED; 

int main() 
{ 

cout << "Enter seed for random number generator: "; 
cin >> RANDOM_SEED; 
RandomNumberGenerator rng(RANDOM_SEED); 

cout << "Enter number of leprechauns: "; 
cin >> N; 

long playtime; 
cout << "Enter game play time (seconds): "; 
cin >> playtime; 
playtime = playtime * 1000; // convert to milliseconds 

double score = 0; 
int nTrapped = 0; 
// CODE FOR INITIALIZING DATA STRUCTURES GOES HERE 
multimap<int, int> DataStructure; 
int gold = 1000000; 
for (int i = 0; i < N; i++) 
{ 
    //Create N-locations based on the amount of leprechauns. 
    //Key: Location Value: What leprechaun is present. 
    double location = i * 1000; 
    DataStructure.insert(make_pair(location, i + 1)); 
} 
//Iterator to traverse around leprechauns: 

//Vector for Gold: 
//Creates N ints with default value of gold(1mil) 
vector<double>LeprechaunGold(N, gold); 

int t = 0; // keep track of number of iterations 
auto start_time0 = chrono::high_resolution_clock::now(); 
auto timeSinceStartMS = 0; 

    multimap<int, int>::iterator it = DataStructure.begin(); 
do { 
    // CODE FOR A SINGLE ITERATION GOES HERE 
    //Iteration - Traverse through the data structure: 
     int vectorIterator = 0; 
     //1 The leprechaun jumps to a new location. 
     //// You can use the random number generator like so: 
     double r = rng.randomBetween1and2(); 
     double x = 0; 
     x = x + r*gold; 
     DataStructure.insert(make_pair(x, it->second)); 
     //Delete old location. 
     DataStructure.erase(it); 
     //2 Determine if Key is inbetween pit. 
     if (x >= -1000 || x <= 1000) 
     { 
      multimap<int, int>::iterator toBeDeleted = DataStructure.find(x); 
      //If it IS between -1000 and 1000(It's in the PIT. "I fell in the pit. You fell in the pit. We all were in the pit.... THE PIT.") 
      //Delete this leprechaun AND put goldVector(of that leprechaun) to 0, and place gold into score. 
      DataStructure.erase(toBeDeleted); 
      score += LeprechaunGold[vectorIterator]; 
      LeprechaunGold[vectorIterator] = 0; 

     } 
     //3 Determine if multiple keys(multiple leprechauns in one spot) 
     //Count X. 
     if (DataStructure.count(x) >= 1) 
     { 
      //If there are greater than one, two leprechauns are occupying the same spot(same key) 
      multimap<int, int>::iterator toBeDeleted = DataStructure.find(x); 
      /*range = DataStructure.equal_range(x); 
      for (it = range.first; it != range.second; ++it) 
      { 

      }*/ 
     } 

     //4 Leprechaun steals half gold from neighbor(s) 
     //Move to next leprechaun in Goldvector: 
     vectorIterator++; 
    t++; 
    it++; 
    // code to measure run time 
    auto end_time = std::chrono::high_resolution_clock::now(); 
    auto timeSinceStart = end_time - start_time0; 
    timeSinceStartMS = chrono::duration_cast<chrono::milliseconds>(timeSinceStart).count(); 
} while (timeSinceStartMS < playtime); 

cout << "Number of iterations = " << t << endl; 
cout << "Number of trapped leprechauns = " << nTrapped << endl; 
cout << "Score = " << (long)score << endl; 
return 0; 

}

+0

コードは難しいですが、イテレータが最後に到達したかどうかは決して確認できません。 – vu1p3n0x

+1

どのラインでエラーが発生しますか? – 4pie0

+2

'map.erase(it)'と '++ it'を呼び出すことはできません。アイテムを消去すると、マップ構造から完全に削除されるので、 '++ 'を行うために必要な情報はもはや入手できません。 'toBeDeleted'が' it'と一致するようにならないよう注意しなければなりません。代わりに 'erase'の戻り値を使用して新しい場所を取得してください –

答えて

1

あなたのループ内のマップを変更して、反復子が無効にはなりません。

これらのすべてをベクターのようなコンテナに入れ、ループが終了した後にそれらを削除します。または、C++ 11を使用している場合は、イテレータをイテレータから次のイテレータに再割り当てします。

it=DataStructure.erase(it); 
関連する問題