C++ 在 Map 中的类的一组值中插入一个值

Posted

技术标签:

【中文标题】C++ 在 Map 中的类的一组值中插入一个值【英文标题】:C++ insert a value in a set of values from a class in a Map 【发布时间】:2017-11-29 15:58:27 【问题描述】:

我的班级Cjt_Trets 中有一个地图,其中包含一个名为rasgo 的字符串和一个名为Trets 的班级。在 Trets 中,我有一个 set<int> id;,它将包含包含 rasgo 的人的 id。当我尝试将函数接收的id 插入该集合时,我的问题就出现了。我该怎么做?

这里我留下部分代码可以帮助你理解我的情况:

类 Cjt_Trets 的私有:

private:
  map<string, Trets> mtrets;  
;

Trets 的私人:

private:
  set<int> id;
  string gen;  
;

代码的实际部分我不知道怎么做:

void Cjt_Trets::afegir_tret(int id, string rasgo)    
  mtrets.insert( make_pair<string, Trets> (rasgo, Trets.id.insert(id)) );

【问题讨论】:

您描述了您在示例中使用的类型和成员,但缺少很多信息。请提供minimal reproducible example。 id 来自 Trets 是私有的,你不能从其他类访问 insert 返回一个 pair 所以你必须修改它 我认为简单地创建两个虚拟类并向我们展示几行的minimal reproducible example 来复制问题会更容易,而不是通过对 Trets 游戏的描述。跨度> make_pair 的目的是不提供模板参数,让推理发生。 【参考方案1】:

因为你有一个类Trets,你不能做Trets.id,因为id是这个类的一个非静态成员,即使是,你也可以通过调用Trets::id来访问它。但是,要将某些内容插入std::map&lt;string, Trets&gt;,您需要Trets 的对象,而std::set::insert 返回std::pair&lt;iterator, bool&gt;,因此您需要从某处创建或接收Trets 的实际对象可以将其插入std::map

【讨论】:

【参考方案2】:

我认为这样的事情应该可行:

void Cjt_Trets::afegir_tret(int id, string rasgo)    
    auto it = mtrets.find(rasgo) ;  // is rasgo already ion the map?
    if (it == mtrets.end())         // if not insert an empty Trets
        it = mtrets.insert(make_pair(rasgo, Trets()).first ;
    // Now insert the id in the Trets referring to this rasgo
    // TODO it->second is of type Trets and id is private member
    // this needs to be fixed
    it->second.id.insert(id) ; 

【讨论】:

即使这样可以工作,代码也可以被压缩成只调用insert,然后使用insert的返回值来更新id。因此,无需调用find 并测试是否找不到该项目。

以上是关于C++ 在 Map 中的类的一组值中插入一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何从给定的一组值中进行选择,四舍五入?

如何确保一列包含一组值中的一个?

从具有相同 id 的一组值中选择最大值

仅从一组值中检索给定标识符和一个列值的多个条目中的行

调整 SVR 的超参数 [关闭]

将字符串重新分配给数组中的一组值列表