map/set迭代器不可递增,我无法从头开始重新启动映射

map/set iterator not incrementable and I cannot restart the map from the beginning

本文关键字:从头开始 映射 重新启动 set 迭代器 map      更新时间:2023-10-16

在这段代码中,我必须遍历一个充满小妖精的地图,并且必须按照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;

}

您不应该修改循环中的映射并使迭代器无效。我相信这句话就是你问题的根源:

DataStructure.erase(it);

将所有这些像向量一样放在一个容器中,然后在循环结束后将它们移除。或者,如果您使用C++11,可以将迭代器重新分配给擦除返回的下一个迭代器。

it=DataStructure.erase(it);