在 std::set 上按名称查找对象
Lookup objects by name on std::set
我需要将一些对象存储在std:set(或任何其他类型的查找表)中,并按名称搜索它们。
例如,假设我有一个类似(伪代码)的类:
class Person
{
std::string mName;
int mAge;
... //etc
};
我想将其存储在容器上并按名称搜索对象。我不能将它们插入 std::set 上,因为据我所知,我必须构造一个完整的对象进行搜索。
我的第二个是使用像 std::map 这样的 std::map,但是,我需要为此复制名称,我不想复制密钥。
有没有办法将这种对象存储在 std::set(或任何其他容器)中并通过键(而不是对象)进行搜索?
谢谢
请查看 boost::intrusive containers,特别是 boost::intrusive::set。
换来的是 Item 类的一些丑陋化,带来了极大的灵活性。发生 Uglization 是因为 Item 必须派生自某个类,或者它必须声明一个特殊的成员变量来存储树链接。不过,这一切都包装得很好。
关于特定请求,boost::intrusive::set 允许
- 重用 mName 作为密钥(与 std::set 不同)
- 通过字符串查找 Person (与 std::set 不同,不需要构造 Person 来执行查找)
因此,
您可以使用find_if
来实现此目的:
struct find_by_name {
find_by_name(const std::string & name) : name(name) {}
bool operator()(const Person & person) {
return person.name == name;
}
private:
std::string name;
};
// in your code
std::set<Person>::iterator result = std::find_if(people.begin(), people.end(),
find_by_name("Ben"));
if(result != people.end()) {
// we found something
}
else {
// no match
}
通过这种方式,您可以仅基于生成的字符串(在结构中)进行搜索,并且它的适应性很强,您可以使用任何字符串对其进行初始化,也可以使用它在任何实现迭代器的容器中搜索person
。
您可以使用 std::find_if
,例如,如果您有std::set<Person> people
auto match = std::find_if(people.begin(), people.end(), [](const Person& foo){return foo.mName == "Bob";});
if (match != people.end())
{
std::cout << "Found Bob!"
}
因此,您不需要创建一个完整的Person
对象,例如,只需创建一个与它们的名称匹配的std::string
。
相关文章:
- 如何在 c++98 中通过特定字段在 QList 中查找对象?
- 按类型与字符串查找对象
- 查找对象属性是否位于对象向量C++中
- 查找对象向量中属性具有相同值的对象
- 在对象向量中查找对象
- C++ 在向量中查找对象并在其上调用成员函数
- C++ 在 Vector 中查找对象成员值
- 在 std 列表中查找对象并将其添加到另一个列表
- 如何在std::vector中查找对象
- OpenCV 使用具有不对应点的求解查找对象的位置
- 在向量C++中查找对象的指针
- 在 std::set 上按名称查找对象
- 在 std::set 中查找对象时出错
- 如何使用OpenCV在视频上查找对象
- 如何根据对象成员值从列表中查找对象
- 在c++中查找对象的未初始化属性
- Qt:在列表中查找对象的属性
- 在c++中,如何通过给出对象的成员来查找对象向量中的某些项
- 如何在std::vector中查找对象
- 在矢量中查找对象,具有多个要求