如何在搜索中不使用std::map的自定义比较函数(map::find)
How not to use custom comparison function of std::map in searching ( map::find)?
正如您在我的代码中看到的,lenMap
是一个带有自定义比较函数的std::map
。这个函数只是检查字符串的长度。
现在,当我想搜索某个关键字(使用map::find
)时,映射仍然使用自定义比较函数。
但是当我搜索某个关键字时,我如何强制我的地图不使用它?
代码:
struct CompareByLength : public std::binary_function<string, string, bool>
{
bool operator()(const string& lhs, const string& rhs) const
{
return lhs.length() < rhs.length();
}
};
int main()
{
typedef map<string, string, CompareByLength> lenMap;
lenMap mymap;
mymap["one"] = "one";
mymap["a"] = "a";
mymap["foobar"] = "foobar";
// Now In mymap: [a, one, foobar]
string target = "b";
if (mymap.find(target) == mymap.end())
cout << "Not Found :) !";
else
cout << "Found :( !"; // I don't want to reach here because of "a" item !
return 0;
}
映射本身不提供这样的操作。比较函子的想法是创建一个内部排序,以便更快地查找,因此元素实际上是根据函子排序的。
如果需要以不同的方式搜索元素,可以使用STL算法std::find_if()
(具有线性时间复杂性),也可以创建使用另一个比较函子的第二个映射。
在您的特定示例中,由于您似乎只对字符串的长度感兴趣,因此您应该使用长度(类型为std::size_t
),而不是字符串本身作为键。
顺便说一下,不需要std::binary_function
作为基类。从C++11开始,它甚至被弃用,例如,请参阅此处。
比较函数告诉map如何对元素排序以及如何区分它们。如果它只比较长度,那么具有相同长度的两个不同字符串将在映射中占据相同的位置(其中一个将覆盖另一个)。
要么将字符串存储在不同的数据结构中并对其进行排序,要么尝试这个比较函数:
struct CompareByLength
{
bool operator()(const string& lhs, const string& rhs) const
{
if (lhs.length() < rhs.length())
{
return true;
}
else if (rhs.length() < lhs.length())
{
return false;
}
else
{
return lhs < rhs;
}
}
};
我没有测试它,但我相信这将首先按照字符串的长度排序,然后按照字符串通常进行比较的方式排序。
您也可以使用std::map<std::string::size_type, std::map<std::string, std::string>>
,并为第一个映射使用长度,为第二个映射使用字符串值。您可能希望将其封装在一个类中,以使其更易于使用,因为没有防止将其弄乱的保护措施。
相关文章:
- 将带有模板的自定义类插入到 std::map 中
- 自定义 OMP 缩减 在 std::map 上
- 编译器错误 C2664 使用 std::map 和自定义类作为其值
- 向 std::map 添加对象和自定义比较<>
- 您可以将STD :: MAP变成带有自定义比较器的无序地图吗?
- 将自定义比较器重载到 std::map
- std::map :使用自定义运算符时更新密钥
- 将 boost odeint 与 std::map 和自定义向量空间代数一起使用时,没有可行的重载'='
- std::map,自定义比较器的设计约束
- “无效的操作数是二进制表达式”当使用自定义结构作为C 中的MAP索引时
- 使用自定义对象的地图使用MAP?可能是语法问题
- 从具有自定义类型的 C++ 中的 std::map 中获取值
- std::map与字符串键和自定义值字段
- std::map,自定义键类型,仅对一个变量进行排序
- std::map 以自定义类作为键返回大小始终为 1
- 如何在搜索中不使用std::map的自定义比较函数(map::find)
- std::map::erase(const key_type&) 比较自定义后停止工作
- 通过自定义宏构建boost::fusion::map(以及更多)
- 如何将自定义对象插入到std::map中
- 为不使用元组的自定义映射模拟std::map迭代器