当覆盖映射中的复杂对象键时,旧对象是否会被删除(C++)
when overwrite complex object key in a map, will old object got deleted (C++)
我有一张 <MyObject, int>
的地图来计算每个实例的出现次数。用相同的 myObject2 覆盖键 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 个内存块 "person") ,或者 "old" 对象仍然存在于内存中?
好吧,它在实现 operator <
功能时对我有用。
std::map
中的键在要添加
时查询其 < 与另一个
当你想在你的地图上添加一个Person
struct/class时,它会被其他人询问是不是。
尝试这样的代码看看到底发生了什么
#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
我有一张 <MyObject, int>
的地图来计算每个实例的出现次数。用相同的 myObject2 覆盖键 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 个内存块 "person") ,或者 "old" 对象仍然存在于内存中?
好吧,它在实现 operator <
功能时对我有用。
std::map
中的键在要添加
当你想在你的地图上添加一个Person
struct/class时,它会被其他人询问是不是。
尝试这样的代码看看到底发生了什么
#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