Как перемешать ключ элемента в std :: map? - PullRequest
0 голосов
/ 08 сентября 2018

Я ищу способ перемешать std :: map в C ++.У меня есть std :: map с ключом в качестве целых чисел и значением как структурой, и я хочу перемешать ключи.Я пытался использовать 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 голосов
/ 08 сентября 2018

Хм, хотя это технически возможно при некотором дополнительном взломе, но при наивном подходе - std::map - это упорядоченное хранилище, то есть оно поддерживает упорядочение среди своих ключей, что является его главной особенностью, по цене логарифмических сложностей простого операции.

std::unordered::map, как следует из его названия, не дает таких гарантий, поэтому вы можете попытать счастья, сделав то же самое с unordered_map ... Если вы просто хотите перебирать элементы карты в неопределенном порядке, ну, используйте перетасовал вектор для него.

...