使用类方法插入std :: map

时间:2017-04-27 16:39:08

标签: c++ class dictionary stl this

我搜索了很多这个问题,但没有找到任何内容,如果它重复,请抱歉。

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

<?php

ini_set('display_errors', 1);
//sample HTML content
$string1='<html>'
        . '<body>'
            . '<div>This is div 1</div>'
            . '<div class="someclass"> <span class="hot-line-text"> hotline: </span> <a id="hot-line-tel" class="hot-line-link" href="tel:0000" target="_parent"> <button class="hot-line-button"></button> <span class="hot-line-number">0000</span> </a> </div>'
        . '</body>'
    . '</html>';

$object= new DOMDocument();
$object->loadHTML($string1);
$xpathObj= new DOMXPath($object);
$result=$xpathObj->query('//div[@class="someclass"]');
foreach($result as $node)
{
    $node->parentNode->removeChild($node);
}
echo $object->saveHTML();

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

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;

}

只有第一个值插入到地图中。我应该更改以这种方式插入地图?

非常感谢你的帮助。

3 个答案:

答案 0 :(得分:0)

你的错误是那个

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

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

的操作时
a.Add(1,5) . Add( 4, 8);

. Add( 4, 8)部分会将该项目添加到a而非a本身的副本中。

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

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

对于声明和定义。

答案 1 :(得分:0)

您插入一次的原因是因为您的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

答案 2 :(得分:0)

问题是您的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();