我想在std::map
中存储班级的对象。这是一个工作示例,显示我如何做到当前
#include <iostream>
#include <map>
class A
{
private:
int a;
std::string b;
public:
A(int init_a, std::string init_b) : a(init_a), b(init_b){};
void output_a() {std::cout << a << "\n";}
};
int main()
{
std::map<size_t, A> result_map;
for (size_t iter = 0; iter < 10; ++iter)
{
A a(iter, "bb");
result_map.insert(std::make_pair(iter, a));
}
return 0;
}
我对这个例子有两个问题:
这是专业的C ++ - 在上述情况下在std::map
中存储对象的方法吗?或者我应该创建一个指向A
对象的指针并存储它?我喜欢第一个(当前)选项,因为我不必担心自己使用new
和delete
进行内存管理 - 但最重要的是我想要正确地做事。
我如何调用result_map[0]
的成员函数?我天真地尝试result_map[0].output_a()
,但这给了我错误:error: no matching function for call to ‘A::A()’
答案 0 :(得分:5)
这是专业的C ++ - 在上述情况下在std :: map中存储对象的方法吗?
这很好,更简单的代码可能是:
edFile.Close();
你应该使用你觉得更具可读性的东西。顺便说一下,调用整数计数器result_map.emplace(iter, A(iter, "bb") );
不是编写可读代码的方法。
如何调用result_map [0]的成员函数?
您最好使用iter
:
std::map::find
你的案例中auto f = result_map.find( 0 );
if( f != result_map.end() ) f->output_a();
的问题 - 它必须创建和实例,如果该索引不存在对象,但你没有operator[]
的默认ctor。
答案 1 :(得分:0)
1- 取决于:如果您的课程可以复制,并且您不担心将对象复制到地图中会出现性能问题,那么这是一个很好的方法。但是,如果你的班级持有任何不可变数据(例如std::mutex
),你必须使用指针,因为c ++自动生成的复制构造函数会生成错误,所以它只是不能复制课程
2- result_map.at(0).output_a()
或result_map.at(0)->output_a()
如果你正在使用指针地图