Я хочу перебирать карту, адрес которой хранится в указателе, поэтому я могу получить доступ и изменить исходную карту, однако всякий раз, когда я пытаюсь выполнить итерацию, это всегда дает мне нарушение доступа для чтения.
#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;
};
Как мы итерируем правильно?
(*ptr).mbr
— это то, для чего предназначен оператор ->
: ptr->mbr
.
Кстати: bool equals(B *arr, int size) const {return std::equal(arr, arr + size(), m->begin(), m->end(), [](const B& b, const auto& p){ return b == p.second; });}
Вы храните адрес локальной копии с помощью
map_array_util(std::map<A,B> _m)
{
m = &_m;
}
Итак, у вас есть оборванный указатель.
Вероятно, вы захотите пройти по ссылке:
map_array_util(std::map<A,B>& _m) : m(&_m) {}
Вот и все. Спасибо за помощь
Вместо map_array_util(std::map<A,B> _m)
вы, возможно, имели в виду
map_array_util(std::map<A,B> &_m)
// ^
Кстати, этот класс не очень хорошая идея IMO. Вы можете лучше управлять своим классом из reference_wrapper.
Не могли бы вы уточнить свой комментарий о reference_wrapper?
Я имел в виду en.cppreference.com/w/cpp/utility/functional/reference_wrapper
map_array_util(std::map<A,B>& _m)
вместоmap_array_util(std::map<A,B> _m)
, а затем вы должны убедиться, что ваша карта не будет удалена из стека или из того места, где вы когда-либо сохраняли карту после вызоваmap_array_util
. Кстати. это не очень хорошая практика.