gpt4 book ai didi

c++ - 智能指针作为 map 键

转载 作者:可可西里 更新时间:2023-11-01 15:54:54 36 4
gpt4 key购买 nike

我有以下代码来测试智能指针作为 std::map 的键,我在 Mac 和 Linux 上运行代码,但我观察到不同的输出,这是一个错误还是我完成了有什么问题吗?

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

using namespace std;

class Dog {
public:
typedef shared_ptr<Dog> sptr;

Dog(const string &name) : name_(name) { }

friend bool operator<(const Dog &lhs, const Dog &rhs) {
cout << "Dog::operator< called" << endl;
return lhs.name_ < rhs.name_;
}

friend bool operator<(const sptr &lhs, const sptr &rhs) {
cout << "Dog::operator< sptr called" << endl;
return lhs->name_ < rhs->name_;
}

private:
string name_;
};

void test_raw_object_as_map_key() {
cout << "raw object as map key ============== " << endl;
map<Dog, int> m;
m[Dog("A")] = 1;
m[Dog("B")] = 2;
m[Dog("C")] = 3;
m[Dog("A")] = 4;

cout << "map size: " << m.size() << endl;
}

void test_smart_pointer_as_map_key() {
cout << "smart pointer as map key ============== " << endl;

map<Dog::sptr, int> m;
m[make_shared<Dog>("A")] = 1;
m[make_shared<Dog>("B")] = 2;
m[make_shared<Dog>("C")] = 3;
m[make_shared<Dog>("A")] = 4;

cout << "map size: " << m.size() << endl;
}

int main(int argc, const char *argv[]) {
test_raw_object_as_map_key();
test_smart_pointer_as_map_key();
return 0;
}

在苹果机上:

neevek@MAC$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

neevek@MAC$ ./a.out
raw object as map key ==============
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
map size: 3
smart pointer as map key ==============
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
Dog::operator< sptr called
map size: 3

在 Linux 上:

neevek@LINUX$ g++ --version
g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

neevek@LINUX$ ./a.out
raw object as map key ==============
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
Dog::operator< called
map size: 3
smart pointer as map key ==============
map size: 4

最佳答案

GCC 是正确的(在 Mac 上,如您所见,g++ 实际上是 clang):std::map使用 std::less<T>比较键。这反过来调用 operator <在参数上,但首先在 namespace std 中执行查找, 所以它找到了 shared_ptr 的默认实现, 比较内部指针。要完成这项工作,您必须专门研究 std::less对于 shared_ptr<Dog> :

namespace std {
template<>
struct less<shared_ptr<Dog>> {
bool operator() (const shared_ptr<Dog>& lhs, const shared_ptr<Dog>& rhs) {
return *lhs < *rhs;
}
};
}

关于c++ - 智能指针作为 map 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26252698/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com