C ++从指针遍历映射
C++ Iterating through map from pointer
我想遍历一个地图,它的地址存储在一个指针中,所以我可以访问和修改原始地图,但是每当我尝试迭代时,它总是给我一个读访问冲突。
#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;
};
我们如何以正确的方式迭代?
您将本地副本的地址存储为
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)
// ^
顺便说一句,这 class 在我看来不是一个好主意。您可以从 reference_wrapper.
更好地驾驶您的 class
我想遍历一个地图,它的地址存储在一个指针中,所以我可以访问和修改原始地图,但是每当我尝试迭代时,它总是给我一个读访问冲突。
#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;
};
我们如何以正确的方式迭代?
您将本地副本的地址存储为
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)
// ^
顺便说一句,这 class 在我看来不是一个好主意。您可以从 reference_wrapper.
更好地驾驶您的 class