用于容纳URI主机名的容器
Container to hold URI host names
我遇到了一个问题,可能需要使用更不寻常的数据结构,但我不确定。
从本质上讲,我希望将URI主机名存储在容器中,并能够查询容器来判断容器中是否存在主机名。但是,如果容器包含某个主机名的较高级别域,则如果查找较低级别域,我希望查询返回true
。换句话说,如果容器包含example.com
,我希望能够查找www.example.com
,它将返回true
。或者,如果容器包含foo.example.com
,我希望能够查找bar.foo.example.com
,并且它将返回true。
我已经考虑过这个问题,但似乎没有任何简单的方法来解决这个问题。显而易见的解决方案是只使用一个常规的关联容器,比如哈希表或树(C++中的std::unordered_set
或std::set
)。查找后,我必须遍历域名的每个段,并不断查询容器,看看它是否包含每个段。因此,如果我需要查找www.example.com
,我必须执行三个查询:一个用于com
,一个用于example.com
,一个为www.example.com
。一旦我得到一个阳性,我就会返回true
,否则如果容器中没有这些,则返回false。
这个解决方案很好,可能也是我最终会采用的解决方案。但这似乎不对,因为我必须根据主机名的长度进行N个查询。由于主机名通常没有那么多段,所以我并不担心性能。但我担心我应该在这里做一些更聪明的事情,尤其是因为这似乎是其他人已经考虑过的问题。
我考虑使用一种更奇特的数据结构,比如Patrica Trie或其他类型的前缀感知容器。我确实有一个很好的库来实现这个结构,所以使用它不是问题。但是,经过思考,我认为Patricia Trie不会有帮助。尝试是为键是前缀,值是全长字符串的情况而设计的。在我的情况下,键通常比容器中的任何值都长。换句话说,我的密钥可能是www.example.com
,如果容器有example.com
,我希望它能够找到example.com
。但是,Patricia尝试了相反的工作方式。
那么,使用常规关联容器是最好的方法吗?或者还有什么其他建议?
一个简单的解决方案,颠倒节点顺序(即将www.example.com
转换为com.example.www
),并将其填充到Patrica Trie中。然后你可以遍历trie,直到你一次找到你的匹配
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 用于容纳URI主机名的容器