说明:c++版本为c++ 11,java版本参考java se8,如果版本不同可能有差异;
c++ | JAVA | 解释 |
---|---|---|
array | [ ] | 固定大小的数组 |
vector | ArrayList | 可变长度的数组 |
Vector | 可变长度数组,支持同步操作,效率比ArrayList略低 | |
list | LinkedList | 链表,便于增删 |
forward_list | 单链表,注意不提供size()操作 | |
deque | ArrayDeque | 双端队列 |
stack | Stack | 栈 |
queue | Queue | 队列 |
priority_queue | PriorityQueue | 优先队列(大根堆、小根堆) |
set ps:java里如果希望Set集合去除自定义重复对象,要记得重写对象的hashCode和equals方法 set底层是map实现 | TreeSet | 集合,默认底层基于红黑树对数据按大小升序排序; 自定义类型排序要重写排序规则 |
multiset | 集合,允许重复元素 | |
unordered_set | HashSet | hash组织的set,数据无序;jdk8之前哈希表采用数组+链表组成,jdk8之后采用数组+链表+红黑树组成 |
unordered_multiset | hash组织的multiset,支持重复数据 | |
LinkedHashSet | 按插入顺序排序,支持hash查找,相比HashSet,底层增加了双链表记录数据增添顺序 | |
map ps:java里如果希望map集合去除作为键的自定义重复对象,要记得重写对象的hashCode和equals方法 | TreeMap | key-value映射,按照key排序,自定义类型排序要重写排序规则 |
multimap | 允许重复key的map | |
unordered_map | HashMap | hash组织的map |
unordered_multimap | hash组织的multimap | |
LinkedHashMap | 按插入顺序排序,支持hash查找,底层依然是哈希表实现,但是增加了双链表记录数据增添顺序 | |
HashTable | 类似HashMap,支持同步操作 | |
bitset | BitSet | 位操作 |
TreeSet 自定义类型排序要重写排序规则:
PS:TreeSet是由TreeMap实现,所以TreeMap的自定义排序同理。
方法一:让自定义的类实现Comparable接口,这样直接调用TreeSet插入自定义对象即可自动排序:
public class Car implements Comparable<Car>{
String name;
double price;
public double getPrice() {
return price;
}
@Override
public int compareTo(Car o) {
return Double.compare(this.price,o.getPrice());
}
//注意这种情况下,当对象价格相同,TreeSet 会认为是重复对象,会只保留第一个对象。
//要想价格相同也保留,可以在Double.compare(this.price,o.getPrice())的值是0的时候返回1或-1。
方法二:TreeSet带有参数构造器,可以自定义Comparator匿名类对象来定制比较规则
TreeSet<Car> myset = new TreeSet<>(new Comparator<Car>() {
@Override
public int compare(Car o1, Car o2) {
return Double.compare(o1.getPrice(), o2.getPrice());
}
});
//lambda简写格式:
TreeSet<Car> myset = new TreeSet<>((o1, o2) -> Double.compare(o1.getPrice(), o2.getPrice()));
注意当同时定义了类实现Comparable接口和自定义Comparator匿名类对象俩种方法时,java默认选择后者作为排序准则。