c++中怎样实现字符索引的数组

2024-05-19 23:46

1. c++中怎样实现字符索引的数组

①c++中的char(字符)可以直接当做数字用;比如
int a[300];char c='a';a[c]=...;这样的写法是可以的。因为c虽然是char但仍然当做数字。
②使用c++中的map就可以了
map可以不仅让char当下标,甚至可以让任意类型当下标,内部实现是set(红黑树),时间复杂度logN。
//记得前面要#includemap Mp;//这边泛型除了char还可以写其他类型char c='a';Mp[a]=...;

c++中怎样实现字符索引的数组

2. C++的STL标准库中hash_map生成的哈希表大小怎么设置?

hash_map自动扩容的不需要设置
可以在构造时设一个较大初始容量值

3. c++ 哈希表中,可不可以使用自己定义的数据类型(如list)作为key?

可以把list的指针地址强转成int作key

c++ 哈希表中,可不可以使用自己定义的数据类型(如list)作为key?

4. 为什么大多数数据库的索引结构使用B-Tree索引,而不是Hash索引

数据量大了,Hash冲突不好解决吧

5. C++如何按照索引,快速放到指定位置

标准STL里面的std::map就可以做到啊。查找复杂度为O(log(n)),当N增大1000倍的时候查找时间只增大10倍。

如果你还嫌慢,用hash,自己写个哈希表,或者用GCC或VC提供的扩展hashmap容器。

C++如何按照索引,快速放到指定位置

6. C++ hash_map 那位能给个自定义 哈希表,比较函数,和冲突函数的 代码看看?

我移植过一个java JDK中的hashmap,你要的话可以问我要,JDK中的实现非常好,哈希函数几乎是完全平均的,冲突采用的是桶策略,使用链表实现。给你贴一下哈希函数的代码:
int hashCode(string s) {  
    int h = 0, off = 0;  
    int len = s.length();  
    for (int i = 0; i < len; i++)  
        h = 31 * h + s[off++];  
         return h;  
} 
上面是String类的hashCode的计算,在HashMap中,基于这个结果又进行了进一步计算,算法如下:
int hash(int h) {  
        h ^= (h >>> 20) ^ (h >>> 12);  
        return h ^ (h >>> 7) ^ (h >>> 4);  
}
把两个函数写在一起就可以用了 

原来你是用这个hash_map啊,那给你篇文章自己看看吧,应该不是很难,照猫画虎应该可以写出来。

http://hi.baidu.com/mxp446533129/blog/item/707b93953ae9396055fb9639.html

7. hash_map 最大可以插入多少个

如果指的是STL的 hash_map,可能要注意,在C++11里,hash_map 现在已经建议用 unordered_map 替代了。
其实,不光是STL,只要是Hash原理的Map可插入的容量一般都与以下几个要素相关(借助磁盘永久化的哈希除外,它们基本没有限制)。
1、载荷的内存消耗。每一条记录的Key 均对应了一个节点,存储Key,Value两个值
2、哈希表的索引消耗。包含桶地址表(往往有一定的冗余)、每个桶的链表。
3、其他少量中间变量和维护内存。
因此,假设Key,value 体积的数学期望(均值)为M字节,哈希表中,桶地址的冗余率期望为k(k>1),一个桶地址字节长度为B字节,桶链表一个节点为L字节,维护内存D字节,则,对已知内存容量C,存储的个数N的方程为
N*M + (B * k ) * N + L * N + D=  C

=>
N = (C - D) /(M + kB + L)

hash_map 最大可以插入多少个

8. MySQL的btree索引和hash索引的区别

对于单个字段:
hash是精确定位(起作用于field=xxx这种情形),而btree是序列定位(可以对field>=xxxxx这种情形生效),如果同样是在field=xxx这种情形下,hash的效率更高。

对于多字段联合索引:
例如(field1+field2)联合索引下,查询WHERE field1=xxxx AND field2=xxxx时,两种索引都会生效(hash效率更高),但如果查询WHERE field1=xxxx时,只有btree索引会生效,而hash索引此时不起作用!
最新文章
热门文章
推荐阅读