思想:使用两个map。一个存放string int
另一个存放映射 int string 用此来保证等概率
删除的时候:用最后的位置来填补删除位之的空缺
class Poll
{
public:
Poll() { this->size = 0; }
void Map_insert(string);
void Map_delete(string);
void GetRandom();
private:
map<string,int>m1;
map<int,string>m2;
int size;
};
void Poll::Map_insert(string word)
{
map<string, int>::iterator p = m1.find(word);
if (p == this->m1.end())//原来没有,可以进行插入
{
m1.insert(pair<string, int>(word, size));
m2.insert(pair<int, string>(size++, word));
}
}
void Poll::Map_delete(string word)
{
map<string, int>::iterator p = m1.find(word);
if (p != this->m1.end())//找到了,可以进行删除
{
string key=m2.find(size - 1)->second;//记录下最后一个元素
int value = p->second;//记录下最后一个元素的标号
m1.erase(word);//删除要求word
m1.erase(key);//删除M1中最后一个
m2.erase(value);//删除word对应那个
m2.erase(size--);//删除最后一个位置
m1.insert(pair<string, int>(key,value));//把删除位置进行填补,保证等概率
m2.insert(pair<int, string>(value, key));//同上
}
}
void Poll::GetRandom()
{
srand((unsigned)time(NULL));
int num = rand() % size;//0-size-1
cout << m2.find(num)->second;
}