- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的代码中,我有一些字符串(DNA 序列)我存储在一个 vector 中。我有一个 struct
,read_tag
用来识别每个字符串; read_tag.read_id
是字符串标识符。我将每个字符串的 30 个字符子串用作 unordered_multimap
中的键,并将 read_tag
作为值;目的是对共享 30 个字符序列的字符串进行分组。自然地,相同的字符串将散列为相同的值,并最终在多映射中的相同桶中。偏移量用于给出从 30 个字符标签的索引零开始的“移位”。
但是,当我运行这段代码时,遍历每个桶;我发现同一个桶中有多个不同的序列。我认为冲突在 unordered_mutlimap
中得到了解决,因此在一个桶中,它们应该只是一个键(字符串)。我知道可能会发生碰撞,但我认为链接、探测等是在 unordered_mutlimap
中实现的。您应该能够运行并检查输出以查看我感到困惑的地方。
我还 std::hash
每个键,一个在桶中,我发现“碰撞”中的键具有不同的哈希值。
因此,就好像碰撞正在发生,导致具有差异的值。同一个桶中的键,但矛盾的是,键散列到不同的值。他们是避免这种情况并根据存储桶中的键区分值的方法吗?还是我需要执行此操作?
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <functional>
using namespace std;
int main() {
vector<string> reads;
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("GGCAGGGTCATACCCGATTAACTTGTTATAGAGTATGGGGCATCAACTTGGGCAGCAATGGGGAACGGTGTCTCTGGAAG");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCGGGCGTGGTGGCGTGCACCTGTAATCCCAGCTACTTGGGATGTTCAGGCAGGAGACTCGCTTGATCCCCGGGGACGGA");
reads.push_back("CCAGCTGCTCTCACCCTGGGCAGGGTCCCTGCACACACTGTATCTTTTGAGGTCCCTTCAGGACCCCGGTTTGCTGCCTC");
struct read_tag{
unsigned int read_id; // unique string identifier
int offset; // shift of 30 character substring represented by tag
};
unordered_multimap<string, read_tag> mutation_grouper;
for(int read_id=0; read_id < reads.size(); read_id++) {
string read = reads[read_id];
for(int i=0; i < read.size()-30; i++) {
string sub_read = read.substr(i, 30);
read_tag next_tag;
pair<string, read_tag> key_val;
next_tag.read_id = read_id;
next_tag.offset = i;
key_val.first = sub_read;
key_val.second = next_tag;
mutation_grouper.insert(key_val);
}
}
cout << "mutation_grouper buckets" << endl;
std::hash<std::string> hash_er;
for(unsigned int bucket = 0; bucket < mutation_grouper.bucket_count(); bucket++) {
cout << "Bucket: " << bucket << endl;
for( auto local_it = mutation_grouper.begin(bucket);
local_it != mutation_grouper.end(bucket); ++local_it) {
cout << local_it->first << " : " << local_it->second.read_id
<< ", " << local_it->second.offset << ", " << endl;
cout << "hash value: " << local_it->first <<"::: " << hash_er(local_it->first) << endl;
}
cout << endl << endl;
}
}
最佳答案
是的,你是对的。不能保证两个不同的项目落在两个不同的桶中。您只知道,两个相同的项目落在同一个桶中。
您的问题的解决方案很简单,就是避免出现水桶。类 unordered_multimap
(以及 multimap
)具有方法 equal_range
,它为您提供具有特定键的元素范围。因此,您只需遍历所有键,并使用 equal_range
遍历所有值。遗憾的是,没有方法可以让您遍历键,因此您必须有点棘手。以下代码应为您提供所需的输出:
// iterate through all elements in the multimap
// don't worry, we'll skip a bunch
for (auto it = mutation_grouper.begin(); it != mutation_grouper.end(); )
{
// Get the range of the current key
auto range = mutation_grouper.equal_range(it->first);
// Print all elements of the range
cout << it->first << endl;
for (auto local_it = range.first; local_it != range.second; ++local_it)
std::cout << " " << local_it->second.read_id << " " << local_it->second.offset << '\n';
// Step to the end of the range
it = range.second;
}
关于c++ - 通过 local_it 遍历 bucket 时 unordered_multimap 中的碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38528578/
我在练习 unordered_multimaps 时遇到了一个问题,一个 unordered_multimap 包含另一个 unordered_multimap。编译器抛出一个错误,说 c++ 标准不
我在这里要疯了。我通过谷歌搜索找到了 1 个不错的示例,其中人们将 unordered_map 与枚举类和哈希函数一起使用,但没有任何运气。我设法找到的那些最终总是说“改用 map ”。 我正在尝试执
我正在尝试使用 boost unordered_multimap 类,但在声明它时遇到了问题。错误跟在代码后面。 #include #include // header file needed f
一本书提到对于std::unordered_multimap: The order of the elements is undefined. The only guarantee is that d
所以,伙计们,我玩 std::unordered multimap 只是为了好玩。我想存储(在本例中)unsigned short,带有自定义哈希值和相等值。 有趣的部分是什么?如果两个项目都是偶数或
我尝试使用以下代码将一个值插入到 boost unordered_multimap 中,但这没有用,因为它无法编译。为什么没有访问 [] 运算符? insert()方法也不行? #include #
我有一个 std::unordered_multimap我想只对每个键进行一次迭代。 我目前正在做的是将所有 key 复制到 std::set .这对我来说似乎效率很低,我想知道是否有更聪明的方法来做
在初始化 boost::unordered_multimap 时,我们定义 HashMap 的大小。 explicit unordered_multimap(size_type n = impleme
我有一个 unordered_multimap 代表一个邻接表,还有几个有自环的边。例如: edges_ 可能是: edges_.insert(Edges::value_type(1, std::ma
我可以使用这段代码将所有元素放入一个桶中: typedef boost::unordered_multimap >
我希望 unordered_multimap::equal_range 具有平均恒定的复杂度,但是以下内容并不像预期的那样随 n 线性扩展: #include #include #include
我想创建一个映射,它使用迭代器作为键类型并使用整数作为值,如下例所示: #include #include int main(int argc, char* argv[]) { typedef
如果我有下面这段代码 std::unordered_multimap> myMap; std::vector v1, v2, v3; // init v1, v2, v3.... myMap.inse
我想构建一个 std::unordered_map,其中的值不是单个字符串、整数或 float ,而是元组、 vector 或结构。我知道这可以像@Vittorio_Romeo 和@CoryKrame
我在调试段错误时遇到问题。我很感激有关如何缩小问题范围的提示。 当迭代器试图访问结构 Infection 的元素时出现错误,定义为: struct Infection { public: expl
我有下面的代码,我知道我几乎是在重新实现容器,但我想这样做,我会有更具体的方法和我不想为不同类型的 multimap 重复代码: template class MapTemplate { public
我想访问/迭代 unordered_multimap 中的所有非唯一键。哈希表基本上是来自签名 的映射。这在实践中确实不止一次发生在标识符上 .我想在哈希表中找到那些出现一次的条目。 目前我使用这
在 boost unordered_multimap 中遍历唯一键的最简单方法是什么。 例如我有这个: std::set used; for (auto p : valuesMap) { if
当key不存在时,unordered_multimap::bucket(key)是什么应该回来吗? 引用资料说它应该返回包含键的桶的桶号,但没有说明当 unordered_multimap 中不存在该
我想知道 std::unordered_multimap 中关键对象的唯一性在处理迭代时。 我将尝试解释这一点:我需要将一些数据与 map 中的键类型相关联,这些数据不应在Hash 中考虑。或 Key
我是一名优秀的程序员,十分优秀!