使用类方法插入 std::map

Posted

技术标签:

【中文标题】使用类方法插入 std::map【英文标题】:insert into std::map using class method 【发布时间】:2017-04-27 16:39:07 【问题描述】:

我搜索了很多关于这个问题,但没有找到任何东西,如果重复,请见谅。

我在使用返回 *this 的类方法插入 std::map 时遇到问题。如果我尝试插入更多值,则实际上只插入第一个值。让我给你看我的代码:

using namespace std;

class test
public:
   test()
   test Add(const int &a, const  int &b);
   void print()
    for (auto it = map1.begin(); it != map1.end(); ++it) 
        cout << it->first << " " << it->second << endl;
    


private:
   map<int,int> map1;

;

test test::Add(const int &a, const int &b) 

map1.insert(make_pair(a,b));

return *this;


但是当我尝试这样的事情时:

int main ( void ) 

test a;

a.Add(1,5) . Add( 4, 8);

a.print();

return 0;

只有第一个值被插入到地图中。我应该改变什么才能以这种方式插入地图?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

你的错误是

test Add(const int &a, const  int &b);

按值返回。这意味着从Add 返回的test 与您调用它的test 不同,它是一个副本。这意味着当你做类似的事情时

a.Add(1,5) . Add( 4, 8);

. Add( 4, 8) 部分将项目添加到 a 的副本而不是 a 本身。

解决此问题的方法是通过引用而不是值返回。当您通过引用返回时,您将使用您称为add 的项目而不是副本。这意味着您只需要将函数签名更改为

test& Add(const int &a, const  int &b)

对于声明和定义。

【讨论】:

非常感谢!它解决了问题。 @Cart 没问题。很高兴能提供帮助。【参考方案2】:

您插入一次的原因是因为您的 Add 方法按值返回,而您的第二个 . Add( 4, 8); 最终插入到另一个地图中。要解决此问题,您需要更改您的 Add 以返回对 *this 的引用:

using namespace std;

class test

public:
    test() 
    test& Add(const int &a, const  int &b); // < -- changed to return test&
    void print() 
        for (auto it = map1.begin(); it != map1.end(); ++it) 
            cout << it->first << " " << it->second << endl;
        
    

private:
    map<int, int> map1;
;

test& test::Add(const int &a, const int &b) // < -- changed to return test&

    map1.insert(make_pair(a, b));
    return *this;

Output of your program with the fix 变为:

1 5
4 8

【讨论】:

【参考方案3】:

问题在于您的Add 函数正在返回当前对象的副本。要返回当前对象本身,需要将返回类型更改为引用:

test & test::Add(const int &a, const int &b) 
// ^^^^^
  map1.insert(make_pair(a,b));
  return *this;

您当前的代码将第二个Add 应用于与第一个Add 应用到的对象不同的对象,因此您永远看不到效果。但是,对于欢笑和咯咯笑声,您也可以尝试:

a.Add(1,5) . Add( 4, 8) . print();

【讨论】:

以上是关于使用类方法插入 std::map的主要内容,如果未能解决你的问题,请参考以下文章

在使用基类中的方法时使用派生类中的属性?

接受对抽象类的 const 引用的 C++ 构造函数无法初始化 std::map

std::map 作为类成员

如何在不插入的情况下检查 std::map 是不是包含键?

模板类值的 C++ std::map

当 std::unordered_map 包装在一个类中时,它不接受 std::thread