- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看看下面的代码,我为nocase-c-string键(const char *)重载了哈希函数和字符串等于函数,但是结果却不是我所期望的:找不到主函数,如何使其匹配?
struct hash_c_string
{
std::size_t operator()(const char *ctx) const
{
return MurmurHash2(ctx, strlen(ctx),static_cast<size_t>(0xc70f6907UL));
}
};
typedef struct {
const char * name;
}PortMapConfig;
struct by_name{};
struct CompareEqual
{
inline bool operator()(const char* left, const char* right) const
{
return strcasecmp(left, right)==0;
}
};
using namespace boost::multi_index;
typedef
boost::multi_index_container<
PortMapConfig,
indexed_by<
hashed_unique<tag<by_name>, member<PortMapConfig, const char *, &PortMapConfig::name>, hash_c_string, CompareEqual>
>
> StuContainer;
int main() {
StuContainer con;
PortMapConfig st1 = {"Uplink0"};
con.insert(st1);
auto &indexofName = con.get<by_name>();
const char * s = "uplink0";
auto itr = indexofName.find(s);
if(itr != indexofName.end()){
std::cout << "name:"<<itr->name << std::endl;
}
else
std::cout << "not found!!!"<< std::endl;
return 0;
}
最佳答案
您正在尝试通过派生属性(即大小写折叠的名称)进行哈希处理。
即使做对了¹,这也会很昂贵。这里的所有信号都表明您可能以性能为名进行这些操作。如果您需要不区分大小写的查找,建议您修改要索引的键,这样就可以在它们上具有自然的哈希值和相等性。
¹ Importantly, as the commenter already points out, your solution has Undefined Behaviour because the hash/equality functions don't agree
#include <boost/locale.hpp>
#include <boost/locale/conversion.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index_container.hpp>
#include <iostream>
namespace bmi = boost::multi_index;
static auto inline fold_case(std::string_view sv) {
return boost::locale::fold_case(sv.data());
}
struct PortMapConfig {
/*explicit*/ PortMapConfig(std::string_view name): name(name) {}
std::string_view name;
std::string name_key = fold_case(name);
struct Hash {
std::size_t operator()(std::string_view sv) const {
return boost::hash_value(sv); // TODO(sehe): murmur instead
}
};
using Equal = std::equal_to<std::string_view>;
};
using StuContainer = bmi::multi_index_container<
PortMapConfig,
bmi::indexed_by<bmi::hashed_unique<
bmi::tag<struct by_name>,
bmi::member<PortMapConfig, std::string, &PortMapConfig::name_key>,
PortMapConfig::Hash,
PortMapConfig::Equal>
>>;
int main() {
std::locale::global(boost::locale::generator()("en_US.UTF-8"));
StuContainer con { {"Uplink0"}, {"Uplink1"} };
if (auto itr = con.find(fold_case("uplink1")); itr != con.end()) {
std::cout << "name:" << itr->name << " (" << itr->name_key << ")\n";
}
}
版画
name:Uplink1 (uplink1)
关于c++ - 如何通过哈希匹配boost multi_index_container中的nocase c字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63137352/
有没有办法在 SQLITE 中使用“IN”子句,该子句将敏感地将列与 in 子句中的所有元素进行匹配。我有一个疑问 select * from Table where table.column in
我有 SQLite 数据库: CREATE TABLE IF NOT EXISTS Commits ( GlobalVer INTEGER PRIMARY KEY, Data blob
我有一个数据库(我无法更改),它有一个 collate nocase 字段: name string collate nocase 我需要在这个区分大小写的字段上进行搜索。 'collat
我正在尝试使用COLLATE NOCASE按字母顺序排序不区分大小写但出现错误 ORA - 00933 SQL command not properly ended. 下面是我正在触发的查询: SEL
这个问题的答案https://stackoverflow.com/a/973785/1297371:How to set Sqlite3 to be case insensitive when str
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
将Rails 4.2.0与ruby v2.3.0p0一起使用 我想创建不区分大小写的索引,因为我的大多数搜索都不区分大小写,并且我不想每次都进行全表搜索。 因此,在我的create_table迁移中,
SQLite 数据库中的列必须是 COLLATE NOCASE。我认为无法将该功能添加到现有表中,因此我准备用它重新创建表。如何确定现有列是否为 COLLATE NOCASE 以避免每次打开表时都重新
我有一个现有的数据库,他们在其中创建了自己的 unicode 归类序列。我正在尝试使用以下代码并获得“没有这样的整理序列”异常。任何人都可以使用语法来对这段代码使用“collate nocase”
以下是我的 .htaccess .它运行良好,但我在 error_log 中遇到错误文件: [warn] RewriteCond: NoCase option for non-regex patter
复制说明: 从一个空目录开始,我创建了一个 package.json: { "dependencies": { "glob": "7.1.1" } } 7.1.1 是编
我是一名优秀的程序员,十分优秀!