使用 unordered_map 值初始化指向向量的指针时出错

Posted

技术标签:

【中文标题】使用 unordered_map 值初始化指向向量的指针时出错【英文标题】:Error initializing pointer to vector using unordered_map value 【发布时间】:2015-12-01 16:31:12 【问题描述】:

我有一个名为 street_map 的类,它包含一个带有 vector<edge> 类型的 int 键和值的映射。在其中一种方法中,我试图初始化一个指向 vector<edge> 值的指针以获取其内容。

class street_map 
public:
    explicit street_map (const std::string &filename);
    bool geocode(const std::string &address, int &u, int &v, float &pos) const;
    bool route3(int source, int target, float &distance) const 
        auto it = adjacencyList.find(source);
        vector<edge>* v = &(it->second);
        return true;
    
private:
    unordered_map<side , vector<segment>> map;
    unordered_map<int, vector<edge>> adjacencyList;
;

vector&lt;edge&gt;* v = &amp;(it-&gt;second); 行给出了错误:

Cannot initialize a variable of type 'vector&lt;edge&gt; *' with an rvalue of type 'const std::__1::vector&lt;edge, std::__1::allocator&lt;edge&gt; &gt; *'

这是边缘类:

class edge 
    int node;
    string street;
    float length;
    int startingNode;
public:
    edge(int startingNode, int node, string street, float length) 
        startingNode = startingNode;
        node = node;
        street = street;
        length = length;
    
;

我想知道这是否是因为 const 关键字以及如果是因为 const 关键字如何解决这个问题(我应该保留 const 关键字,但我想如果没有其他关键字我可以摆脱它解决方案)。

【问题讨论】:

it 很可能是一个 const_iterator。所以你要么需要一个非常量迭代器,要么必须将你的向量分配给一个 const 指针。 route3 是一个 const 成员函数 => adjacencyList 是其中的 const => find 返回一个 const_iterator。 const vector&lt;edge&gt;* v = &amp;(it-&gt;second); 在您的应用程序中是否可接受? 【参考方案1】:

您有四个选择:

1) 将指向向量的指针设为 const

您将无法修改矢量。

bool route3(int source, int target, float &distance) const 
        auto it = adjacencyList.find(source);
        const vector<edge>* v = &(it->second);
        return true;
    

2) 让你的 adjacencyList 可变

可变意味着可以从 const 函数作为非 const 访问 - 如果您不注意访问设计,这可能会有风险!

private:
    unordered_map<side , vector<segment>> map;
    mutable unordered_map<int, vector<edge>> adjacencyList;

3) 复制向量

这可能会带来更大的开销,并且对矢量所做的更改不会存储在您的地图中。

vector<edge> v = (it->second);

4) 使函数非 const

请注意,这种方式无法在 street_map 为 const 的上下文中调用函数!

bool route3(int source, int target, float &distance) 
        auto it = adjacencyList.find(source);
        vector<edge>* v = &(it->second);
        return true;
    

【讨论】:

以上是关于使用 unordered_map 值初始化指向向量的指针时出错的主要内容,如果未能解决你的问题,请参考以下文章

std :: unordered_map向量下标超出范围

c++ stl unordered_map 如何打印其所有值?

迭代器在添加到添加到列表向量的结构中时会停止指向某个值吗?

不支持 NodeJS 插件 Unordered_map?

未初始化的值是由堆分配创建的:Unordered_map

仅使用带有键的 unordered_map 来存储指针(忽略值)