如何在 C++ 中的 map STL 中将键作为类插入

Posted

技术标签:

【中文标题】如何在 C++ 中的 map STL 中将键作为类插入【英文标题】:How can I insert key as a class in map STL in C++ 【发布时间】:2016-08-01 06:50:01 【问题描述】:

下面的程序有什么问题,为什么我不能用类作为键来初始化地图

#include <iostream>
#include <map>

#include <utility>

using namespace std;

class User

    int value_1;
    int value_2;
public:
    User( int num_1, int num_2)
    
        value_1 = num_1;
        value_2 = num_2;
    
    int getId()
        return value_1;
    
    int getUid()
        return value_2;
    
    bool operator< (const User& userObj) const
    
        if(userObj.value_1 < this->value_1)
            return true;
    
;

int main()

    std::map<User, int> m_UserInfoMap;

    m_UserInfoMap.insert(std::make_pair<User, int>(User(1,2), 100) );
    m_UserInfoMap.insert(std::make_pair<User, int>(User(3,4), 120) );
    m_UserInfoMap.insert(std::make_pair<User, int>(User(5,6), 300) );
    std::map<User, int>::iterator it = m_UserInfoMap.begin();
    for(; it != m_UserInfoMap.end(); it++)
    
        std::cout<<it->first.getId()<<" :: "<<it->second<<std::endl;
    
    return 0;

在上面的程序中,如果我尝试将键添加为类,则会出错。 并请告诉不同的方式来初始化地图。

【问题讨论】:

如果我尝试初始化地图,例如:m_UserInfoMap[a] = 1;它工作正常”但是如果 std::map m_UserInfoMap = (a,1); 或 std::map m_UserInfoMap (a,1); 它不工作,所以穿什么以上说法? 我们不会再次做你的编译器的工作。发布错误。 提高警告级别。你犯了一个小错误:非 void 函数 always 必须返回一些东西。 你在说哪个非 void 函数?我在询问地图插入部分中的 make_pair 函数。 你只定义了三个函数。阅读它们并找出问题所在。 【参考方案1】:

std::mapvalue_typestd::pair&lt;const Key, T&gt;,表示密钥保存为const。所以你不能像std::cout&lt;&lt;it-&gt;first.getId()这样对它们调用非常量成员函数。

您应该将 User::getId()(和 User::getUid())更改为 const 成员函数。如:

int getId() const 
//          ~~~~~
    return value_1;

int getUid() const 
//           ~~~~~
    return value_2;

顺便说一句:当if 条件在operator&lt; 中失败时,您没有返回任何内容。

bool operator< (const User& userObj) const

    if(userObj.value_1 < this->value_1)
        return true;
    else
        return false;  // return for else case

或者只是

bool operator< (const User& userObj) const

    return userObj.value_1 < this->value_1;

【讨论】:

if(condition) return true; else return false; 风格不好,最好不要显示这样的东西... @Aconcagua 我同意这一点。我想强调 OP 也应该为隐含的 else 情况返回 sth。反正我最后写了一个最简单的。 :)【参考方案2】:

首先,你应该让你的操作符总是返回一个值:

bool operator< (const User& userObj) const

    return userObj.value_1 < this->value_1;

您确定要将x &lt; yy.value &lt; x.value 进行比较吗?否则,你需要改变里面的比较:

bool operator< (const User& userObj) const

    return this->value_1 < userObj.value_1;

而且在写这个答案的时候,宋元瑶第二部分的速度比我快,所以看看他的答案……

【讨论】:

以上是关于如何在 C++ 中的 map STL 中将键作为类插入的主要内容,如果未能解决你的问题,请参考以下文章

stl中的C++ map::find()

使用自定义类类型作为键的 C++ unordered_map

使用自定义类类型作为键的 C++ unordered_map

使用自定义类类型作为键的 C++ unordered_map

使用自定义类类型作为键的 C++ unordered_map

使用自定义类类型作为键的 C++ unordered_map