C ++ Итерация по карте из указателя - PullRequest
0 голосов
/ 27 мая 2019

Я хочу выполнить итерацию по карте, адрес которой хранится в указателе, поэтому я могу получить доступ и изменить исходную карту, однако всякий раз, когда я пытаюсь выполнить итерацию, это всегда дает мне нарушение прав на чтение.

#include <map>

template<typename A, typename B>
class map_array_util
{
public:
map_array_util(std::map<A,B> _m)
{
    m = &_m;
}

void copy(B *arr, int size)
{

}

bool equals(B *arr, int size) const
{
    int i = 0;
    for (auto it = (*m).begin(); it != (*m).end(); ++it)
    {
        std::pair<A, B> p = *it;
        if (*(arr + i) != p.second)
        {
            return false;
        }
        i++;
    }

    return true;
}
private:
std::map<A, B> *m;
};

Как правильно выполнить итерацию?

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Вы храните адрес локальной копии с

map_array_util(std::map<A,B> _m)
{
    m = &_m;
}

Итак, у вас есть свисающий указатель.

Вы, вероятно, хотите передать по ссылке:

map_array_util(std::map<A,B>& _m) : m(&_m) {}
2 голосов
/ 27 мая 2019

Вместо map_array_util(std::map<A,B> _m) вы, возможно, имели в виду

map_array_util(std::map<A,B> &_m)
//                           ^

Кстати, этот класс не очень хорошая идея, ИМО. Вы можете лучше управлять своим классом из reference_wrapper.

...