如何在std :: map中随机播放元素键?

时间:2018-09-08 14:34:18

标签: c++ stdvector shuffle stdmap

我正在寻找一种在C ++中随机播放std :: map的方法。 我有一个std :: map,键为整数,值为struct,我想改组键。 我尝试使用std :: random_shuffle,但无法编译。因此,我创建了一个临时矢量,然后填充了该矢量,对其进行洗牌并用于在地图中进行交换。

这是我目前的工作方式:

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <ctime>  
#include <cstdlib>

std::vector<int> temp_vec_registration;
int myrandom(int i) { return std::rand()%i; }

struct CRegInfo
{
    bool success;
    int num_order;
    int type;

    CRegInfo(bool succ, int num, int type)
        : success(succ), num_order(num), type(type)
        {}
};

typedef std::map<int, CRegInfo> RegInfo;
RegInfo register_chars;

int main()
{
    std::srand(unsigned(std::time(0)));

    temp_vec_registration.clear();
    register_chars.clear();

    for (int i = 0; i <= 10; i++)
        temp_vec_registration.push_back(i);

    std::random_shuffle(temp_vec_registration.begin(), temp_vec_registration.end(), myrandom);

    for (std::vector<int>::iterator it1=temp_vec_registration.begin(); it1!=temp_vec_registration.end(); ++it1)
        register_chars.insert(RegInfo::value_type(*it1, CRegInfo(false, 0, 0)));

    for (auto it2 = register_chars.begin(); it2 != register_chars.end(); ++it2)
            std::cout << it2->first << "\t";
}

但是它不起作用,向量具有随机数,但是映射的键始终具有相同的数字。 (0、1、2、3 .. 10)。

1 个答案:

答案 0 :(得分:-4)

嗯,虽然这在技术上可以通过一些其他黑客手段实现,但是采用幼稚的方法-#ifndef DFTABLES yield = (unsigned char*)(PUBL(malloc))(tables_length); #else yield = (unsigned char*)malloc(tables_length); #endif if (yield == NULL) return NULL; 是有序存储,即它以其对数复杂性为代价,在其键之间保持顺序,这是其主要功能。简单的操作。

顾名思义,

std::map不提供此类保证,因此您可以尝试使用std::unordered::map做同样的运......如果您只是想以不确定的顺序遍历地图项,好吧,请使用经过改组的向量。