我正在C++中实现分布式映射并寻找一个好的API设计。 首先和直接的选择是使它完全像std :: map。问题在于迭代器。如何在C++中实现分布式映射的API?
IMap<std::string,Person>::iterator it;
it = map.find("sample");
if(it == map.end()){
//NULL
}
for(it = map.begin(); it != map.end(); it++){
//iterate
}
在分布式环境中(至少在我正在实现的环境中),没有地图的开始和结束。无论如何,它并没有被排序,所以返回一个迭代器看起来不像一个选项。
第二种选择是复制像下面的返回值类:
Person emptyPerson;
Person person = map.get("sample");
if(person == emptyPerson){
//NULL
}
问题是与空检查看起来很奇怪。您可以首先询问它是否可用,然后获取对象,但要求是这些操作必须是原子的。
第三个选项是返回指针:
Person* person = map.get("sample");
if(person == NULL){
//NULL
}
我不想做这种方式,因为它是很容易出错。用户需要删除我在内部创建的指针。
我想返回一个类,像包装用户对象:
value_reference<std::map, Person> person = map.get("sample");
if(value_reference.hasValue()){
Person p = value_reference;
}
那么你认为什么是最好的办法是什么?
你知道任何类似于我的分布式映射的需求吗?
在C++中,大多数更新操作使迭代器失效。所以,如果你获得一个迭代器,我认为你可能会随时使迭代器失效(如果你没有相应处理它)。另一方面,你存储一个Person,而不是Person指针,所以你的方法不应该返回Person *。实际上,Person对象上的更新可能不会影响相应地图上的原始对象。将Person封装到另一个容器类中并使用它来访问原始对象可能会更好。它可能会将访问包含许多数据的有效数据的问题分开。 – phoad
即你可以保留一个像RemotePerson这样的类,并且你的容器可以包含这个类的对象。所以你可能有方法来检查这个单个对象的可用性等等。因此,地图可能只能处理其包含这些对象的工作,并保持对人的原始位置的引用。 RemotePerson的工作可能是检查Person是否仍然存在等。您可以将RemotePerson自动转换为Person,如共享指针。 – phoad