Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何找到共同价值_C++ - Fatal编程技术网

C++ 如何找到共同价值

C++ 如何找到共同价值,c++,C++,我有一个区域结构,在那里我存储上层区域。结构位于映射中,AreaID作为键。区域可以有直接上部区域或间接上部区域 struct Area { AreaID area_id_; Name name_; std::vector<Coord> coords_; std::vector<Area*> lower_areas_; Area* upper_area_ = nullptr; bool check_area_ = false

我有一个区域结构,在那里我存储上层区域。结构位于映射中,AreaID作为键。区域可以有直接上部区域或间接上部区域

struct Area
{
    AreaID area_id_;
    Name name_;
    std::vector<Coord> coords_;
    std::vector<Area*> lower_areas_;
    Area* upper_area_ = nullptr;
    bool check_area_ = false;
};
空指针将更改为指向另一个函数中的区域

我需要找到两个区域之间的公共上部区域。必须考虑到间接区域。必须选择最接近区域层次结构中两个区域的公共区域

我已经预先编写了这个代码

AreaID Datastructures::common_area_of_subareas(AreaID id1, AreaID id2)
{
    std::unordered_map<AreaID, Area>::iterator area1 = areas_.find(id1);
    if (area1 == areas_.end()) {
        return NO_AREA;
    }

   std::unordered_map<AreaID, Area>::iterator area2 = areas_.find(id2);
   if (area2 == areas_.end()) {
       return NO_AREA;
   }
   bool check = true;
   while (check) {
      AreaID area_id1 = area1->second.upper_area_->area_id_;
      AreaID area_id2 = area2->second.upper_area_->area_id_;
      if () {
        
    }
}

return common_id;
}

有没有更快的方法来找到公共区域,而不必在其中两次比较所有项目的双for循环?任何帮助都将不胜感激。

我认为您无法避免两个循环

从这里开始,你可以

AreaID Datastructures::common_area_of_subareas(AreaID id1, AreaID id2)
{
    std::unordered_map<AreaID, Area>::iterator areaIt1 = areas_.find(id1);
    if (areaIt1 == areas_.end()) {
        return NO_AREA;
    }

    std::unordered_map<AreaID, Area>::iterator areaIt2 = areas_.find(id2);
    if (areaIt2 == areas_.end()) {
        return NO_AREA;
    }

    const Area& area1 = areaIt1->second;
    const Area& area2 = areaIt2->second;

    // get list of all parent ids from first area
    // use set for easier lookup
    std::set<AreaID> upper_area_ids;
    Area* upper_area_ptr = area1.upper_area_
    while(upper_area_ptr != nullptr) {
        const AreaID &parent_id = upper_area_ptr->area_id_;
        upper_area_ids.insert(parent_id);

        upper_area_ptr = upper_area_ptr->upper_area_;
    }

    // move upward from second area and return on first common parent
    upper_area_ptr = area2.upper_area_;
    while(upper_area_ptr != nullptr) {
        const AreaID &parent_id = upper_area_ptr->area_id_;
        if (upper_area_ids.find(parent_id) != upper_area_ids.end()) {
            // success-case
            return parent_id;
        }

        upper_area_ptr = upper_area_ptr->upper_area_;
    }

    return NO_COMMON_PARENT;
}
因为两个while循环没有嵌套,所以执行时间与树深度成线性关系,因此很难进一步优化


我这边的最后一个建议是:请尝试对变量和代码格式保持一致的命名约定。这简化了与其他人的协作,例如堆栈溢出上的响应者。

进一步研究的搜索词是