std :: map赋值

时间:2012-12-25 00:04:13

标签: c++ map std

ALL, 我有以下代码:

在.h文件中:

struct Foo
{
   int ma;
   double mb;
   Foo(int a, double b)
   {
        ma = a;
        mb = b;
   }
   Foo()
   {
        ma = 0;
        mb = 0.0;
   }
};

class MyClass
{
public:
    MyClass();
private:
     std::map<std::string,Foo> m_map;
};

In .cpp file:

MyClass::MyClass()
{
    m_map["1"] = Foo( 1, 0.1 );
    m_map["2"] = Foo( 2, 0.2 );
    m_map["3"] = Foo( 3, 0.3 );
}

将Foo(0,0)分配给m_map [“2”]的最简单方法是什么?

我可以简单地写

m_map["2"] = Foo( 0, 0 );

但在这种情况下,将创建一个类型为Foo的新变量。

另外,我没有循环,因此无法真正使用迭代器......

谢谢。

5 个答案:

答案 0 :(得分:3)

您可以简单地写一下:

m_map["2"];

以下是cppreference关于std::map::operator[]

的引用
  

使用key作为键并使用默认构造映射值将新元素插入容器,并返回对新构造的映射值的引用。

因此,如果mereley尝试“获取”该值,则会调用默认构造函数。

答案 1 :(得分:2)

如果我理解正确,你可以写

m_map["2"].ma = 0;
m_map["2"].mb = 0;

虽然我不明白为什么

m_map["2"] = Foo(0,0); //or just Foo() because of the overloaded constructor

是个问题。

答案 2 :(得分:1)

C ++使用复制语义,容器会保留您放入其中的内容的副本。另请注意,库可以自由地在容器中复制对象(例如,在重新分配时为std::vector),并且假定对象的副本等同于对象。

如果复制是一个问题(由于性能或语义),那么解决方案是添加一个间接级别并在地图中放置智能指针到对象或代理而不是真实对象本身。

这样,图书馆创建的副本或临时数量将无关紧要。

答案 3 :(得分:0)

  

我可以简单地写

m_map["2"] = Foo( 0, 0 );
  

但在这种情况下,将创建一个类型为Foo的新变量。

不,它会在地图内部商店中创建Foo( 0, 0)实例的副本。

答案 4 :(得分:0)

由于您没有方法来更改Foo的值,是的,只需为map["2"]分配一个新对象即可。旧的将被覆盖 - 因为它是原始对象的副本,它没有任何区别。你的Foo(0,0)只能活很短的时间。

或者,您可以添加Foo::SetAB(int a, double b) { ma = a; mb = b; }函数(或两个函数来设置a和b,或者将两者都设置为零的清除函数,或者对此主题设置其他一些变体。然后使用m_map["2"].SetAB(0, 0); - 在这种情况下,选项之间没有太大区别,但如果Foo是一些复杂的对象需要花费大量的“努力”来创建(例如,有很多成员,有很多值,内存为分配,存储字符串等等)有一个函数来改变成员变量是非常有益的。