在std :: map

时间:2017-07-26 17:59:53

标签: c++

我想在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;
}

我对这个例子有两个问题:

  1. 这是专业的C ++ - 在上述情况下在std::map中存储对象的方法吗?或者我应该创建一个指向A对象的指针并存储它?我喜欢第一个(当前)选项,因为我不必担心自己使用newdelete进行内存管理 - 但最重要的是我想要正确地做事。

  2. 我如何调用result_map[0]的成员函数?我天真地尝试result_map[0].output_a(),但这给了我错误:error: no matching function for call to ‘A::A()’

2 个答案:

答案 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()如果你正在使用指针地图