【问题标题】:C++ Iterating through map from pointerC ++从指针遍历映射
【发布时间】:2019-05-27 14:23:50
【问题描述】:

我想遍历一个映射,该地址存储在一个指针中,所以我可以访问和修改原始映射,但是每当我尝试迭代时,它总是给我一个读取访问冲突。

#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&lt;A,B&gt;&amp; _m) 而不是 map_array_util(std::map&lt;A,B&gt; _m) 然后您必须确保在调用 map_array_util 后,您的地图不会从堆栈中删除,或者您将地图存储在哪里。顺便提一句。这不是好的做法。
  • (*ptr).mbr-&gt; 运算符的含义:ptr-&gt;mbr
  • 顺便说一句:bool equals(B *arr, int size) const {return std::equal(arr, arr + size(), m-&gt;begin(), m-&gt;end(), [](const B&amp; b, const auto&amp; p){ return b == p.second; });}

标签: c++ pointers stdmap


【解决方案1】:

你存储本地副本的地址

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

所以你有悬空指针。

你可能想通过引用传递:

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

【讨论】:

  • 就是这样。谢谢帮助
【解决方案2】:

你的意思可能不是map_array_util(std::map&lt;A,B&gt; _m),而是

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

顺便说一句,IMO 这个类不是一个好主意。您可以更好地从 reference_wrapper 驱动您的课程。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多