【问题标题】:when overwrite complex object key in a map, will old object got deleted (C++)当覆盖地图中的复杂对象键时,旧对象会被删除(C++)
【发布时间】:2018-07-20 18:52:54
【问题描述】:

我有一张<MyObject, int> 的地图来计算每个实例的出现次数。用相等的 myObject2 覆盖 key myObject1 后,myObject1 会被删除,分配给 myObject1 的内存会恢复吗?

例如,我有一个包含姓名、性别、年龄、身高和人的文本文件。假设我只想计算有多少独特的(姓名、性别)对。所以我创建了我的 Person (string name, int gender) 对象,并将其添加到 std::map (假设我必须使用 map 而不是 set)

std::map<Person, int> myMapCounter;
//for each line
  Person newperson(name, gender);
  myMapCounter[newperson] = 1 ;// just a dummy value 
//end for 

int number = myMapCounter.size();

在创建一个与上一行中的旧对象相等的新 Person 对象时,myMapCounter[newperson] = 1 将删除旧对象(恢复内存,因此该特定“人”只有 1 个内存块),或者“ old”对象还会存在于内存中吗?

【问题讨论】:

  • Map 存储其键的副本。而这些副本仅公开为const。您不能更改地图元素的键。
  • 奇怪的问题。使用compare 函数比较密钥。如果旧的和新的同样比较为真,那么这意味着钥匙已经在那里,所以不需要更换任何东西。

标签: c++ memory-management stdmap


【解决方案1】:

好吧,当实现 operator &lt; 函数时,它对我有用。 std::map 中的键在要添加时与另一个查询其

当您想将Person 结构/类添加到您的地图时,与其他人一起查询它是不是。

尝试这样的代码,看看真正发生了什么

#include <map>
#include <iostream>
#include <string>

class Person {
private:
    std::string name;
    std::string gender;
public:
    Person(std::string name, std::string gender): name(name), gender(gender) {}
    Person(const Person &person): name(person.name), gender(person.gender) {}
    inline std::string getName() const { return name; }
    inline std::string getGender() const { return gender; }
    friend bool operator <(const Person &first, const Person &other);
};

inline bool operator <(const Person &first, const Person &other)
{
    std::cout << "Comparing " << first.name << " with " << other.name << "\n";
    if (first.name == other.name) {
        return first.gender < other.gender;
    } else {
        return first.name < other.name;
    }
}

int main() {
    std::map<Person, int> map;
    map[Person("One", "male")] = 1;
    map[Person("Two", "male")] = 4;
    map[Person("A", "male")] = 3;
    std::cout << "Ending adding\n";
    std::cout << map[Person("One", "male")];
}

你会看到类似的东西

Comparing Two with One
Comparing One with Two
Comparing A with One
Ending adding
Comparing One with One
Comparing One with One

【讨论】:

  • 谢谢,但我确实有 '
  • 它是值类型,不是引用类型,这是 C++ 而不是 Java。所以我认为当你创建一个map[Person("One", "male")] 时,你会创建一个“临时变量”,它可以进入函数,函数将内部值与传入的值进行比较,然后传入的值在不再使用时被删除调用者范围,但我认为作为 C++ 优化,不会创建这个对象,我认为它会被优化为“按值传递”的东西
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
相关资源
最近更新 更多