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);
}
};