在C ++上的std :: set中查找和更新自定义对象

时间:2016-03-17 17:45:43

标签: c++ c++11

我在我的项目中创建了2个自定义结构,每个结构都有一个std :: set。

struct Subject {
        std::string name;
        std::set<SubjectFrame> frames;

        Subject(std::string subject_name);

        void AddFrame(SubjectFrame &frame);

        bool operator<(const Subject &rhs) const { return (name  < rhs.name);}
        bool operator==(const Subject &rhs) const { return (name == rhs.name);}
};

struct Dataset {
        std::set<Subject> subjects;
        std::map<int, std::vector<Subject> > classification_groups;

        Dataset(const std::string ds_path);

        void AddSubject(Subject &subject);
        void GetDSFromFileSystem(const std::string dataset_path);
        void GetClassificationGroups(int number_of_groups_to_create);
};

每次我想在我的画面框架中添加一些框架&#39;我称这个函数为:

void Dataset::AddSubject(Subject &subject) {
        set<Subject>::iterator it = this->subjects.find(subject);
        if (it != this->subjects.end()) {
                for (Subject fr : this->subjects) {
                        it->AddFrame(fr);
                }
        }   else this->subjects.insert(subject);
}

调用此函数:

void Subject::AddFrame(SubjectFrame &frame) {
        set<SubjectFrame>::iterator it = this->frames.find(frame);
        if (it != this->frames.end()) {
                if (frame.l_eye_centroid.x != 0) {
                        it->r_eye_centroid = frame.r_eye_centroid;
                        it->l_eye_centroid = frame.l_eye_centroid;
                }
                if (frame.path != "") it->path = frame.path;
                else return;
        }
        else this->frames.insert(frame);
}

因此,添加操作背后的逻辑是:我传递一个对象并检查是否已经在我的std :: set中有一个具有该名称的对象。如果是,我用我的参数对象所具有的信息更新现有对象,如果没有我插入对象,则更新已经注册的对象。

我在尝试编译程序时遇到此错误:

  

错误:没有可行的超载&#39; =&#39;                                                   it-&gt; r_eye_centroid = frame.r_eye_centroid;

     

错误:没有可行的超载&#39; =&#39;                                                   it-&gt; l_eye_centroid = frame.l_eye_centroid;

     

错误:没有可行的超载&#39; =&#39;                                   if(frame.path!=&#34;&#34;)it-&gt; path = frame.path;

     

错误:会员功能&#39; AddFrame&#39;不可行:&#39;这个&#39;参数有类型   &#39; const Subject&#39;,但函数未标记为const                                                   IT-&GT; ADDFRAME(FR);

有人知道造成这些问题的原因是什么,以及如何解决这些问题?

1 个答案:

答案 0 :(得分:5)

对于std :: set,iterator -s是const,这是因为它们被用作set中的密钥,不应修改它以避免严格弱排序中的任何不一致。

解决此问题的一种方法是制作您要修改的字段mutable,但请确保您的set订单中未使用该字段。