持续更新学习使用C++遇到的问题

1、为什么STL中pair调用first使用的是点,而迭代器使用的是箭头

C++中,类对象是指针时需要用箭头,是普通对象时用点。

迭代器是指针类型,用箭头;pair是个结构体,用点。

2、如果有个场景需要存储大量自定义类A(A的实现如下)且可能遇到重复的A,则可以借助哈希表节省内存空间。

class A {
public:
  vector<int> _data;
};

由于此场景的特点是大量数据A且有重复数据,则我们可以仅为unique的数据开辟一块空间。

首先要控制是否开辟内存空间,那我们不能让编译器在栈上自动分配内存空间,所以要使用指针存储A对象。再用一个哈希表存储所有出现过的对象指针。

在这个例子中,就是每遇到一个vector<int>数据,先不用A实例化它,先判断该数据是否在哈希表中,如果不在哈希表中,再开辟一块内存空间来存储这个数据(new一个对象指针)。

用这个方法可以减少为相同的数据反复开辟内存空间的次数,如果数据中很少出现重复数据可以考虑其它方法。

代码实现:新定义一个DataMan作为数据池来管理所有的A指针,DataMan中有成员变量unordered_map<vector<int>, A*> _allData,实现如下:

class DataMan {
private:
  unordered_map<vector<int>, A*> _allData; // 仅作为示例,还需要自己实现Hash函数和Equal函数
public:
  // 构造函数省略
  A* CreateA(vector<int> &_data)
  {
    A* a = new A(_data);
    _allData.insert(make_pair(_data, a));
    return a;
  }
  A* FindA(vector<int> &_data)
  {
    auto iter = _allData.find(_data);
    if (iter != _allData.end()) return iter->second;
    else return CreateA(_data);
  }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值