将迭代器添加到指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将迭代器添加到指针相关的知识,希望对你有一定的参考价值。

struct Region

    Name name_;
    std::vector<RegionID*> lower_regions_;
    RegionID *upper_region_;
    std::vector<StopID*> stop_id_;
;

struct Stop

    Name name_;
    Coord coord_;
    RegionID *region_id_;
;



std::unordered_map<StopID, Stop> stops_;
std::unordered_map<RegionID, Region> regions_;

这是我的地图和结构,其中包含有关公交车站及其所处不同区域的信息。

bool Datastructures::add_stop_to_region(StopID id, RegionID parentid) 
    std::unordered_map<StopID, Stop>::iterator stop = stops_.find(id);
    if (stop == stops_.end()) 
        return false;
    

    std::unordered_map<RegionID, Region>::iterator region = regions_.find(parentid);
    if (region == regions_.end()) 
        return false;
    

    if (stop->second.region_id_ != NULL) 
        return false;
    

    //error: nvalid conversion from ?const std::__cxx11::basic_string<char>* to RegionID* aka std::__cxx11::basic_string<char>*? [-fpermissive]
    stop->second.region_id_ = &region->first;

    //error: no matching function for call to push_back(const std::__cxx11::basic_string<char>*)
    region->second.stop_id_.push_back(&stop->first);
    return true;


我不明白为什么我不能将键从map添加到指针(最后3行代码)。而且我不想将RegionID或StopID作为值存储到结构中,因为否则每次我需要RegionID或StopID的值时,我都需要从map中搜索键。

答案

unordered_map中,键为const。您无法更改。无序映射的迭代器可以访问映射中存储的特定(键,值)对。这样,迭代器的first值为const值。在这两个错误中,您都试图将指向此const值的指针存储到保存非const(可修改)值的结构中。

您可以通过将region_id_更改为const RegionID *并将stop_id_更改为std::vector<const StopID*>来纠正错误,因此它们都是常量指针,但是如果以后尝试通过这些指针进行写入,可能会导致问题。

以上是关于将迭代器添加到指针的主要内容,如果未能解决你的问题,请参考以下文章

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

如何正确声明从非常量迭代器到指针的 const 指针

stl迭代器失效

如何将字符串迭代器值添加到 ArrayAdapter?

unordered_map 迭代器迭代到空指针,无视可能性

将 end() 迭代器转换为指针