众所周知,C++的入门门槛比较高,我个人觉得大部分新手在入门c++的时候都是由于标准库中庞大的工具链,比如说分配器,迭代器,算法,容器等六大组件。我个人也是如此,在学校里学过C,C++, 学的而且不深,只是做了一些简单的作业和考试就草草结束。在找工作或者刷题的时候经常被问的手足无措。
接下来我就把我在刷C++ Leetcode中遇到的一些标准库中的容器列出来,防止我以后不能坚持刷题又忘了。
1, unordered_map:
unordered_map 是关联容器,含有带唯一键的键-值 pair 。搜索、插入和元素移除拥有平均常数时间复杂度。
元素在内部不以任何特定顺序排序,而是组织进桶中。元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。
std::unordered_map 满足容器 (Container) 、具分配器容器 (Allocator Aware Container) 、无序关联容器 (Unordered Associative Container) 的要求。
注:unordered_map
与 map
的最大区别就是前者并不排序,后者容器内部会自动排序。
LC 347 Top K Frequent Elements中用到的unorder_map方法:
unordered_map<int, int> count; //定义key是int, value是int的无序映射散列表
unordered_map<int, vector<int>> buckets; //定义key是int, value是int类型的vector的无序散列表
for (auto &item : count)
item.first // key
item.second // value
auto it = buckets.find(key) // //返回查找到元素的iterator,如未查找到,返回end()
it->second.begin(), it->second().end //就是buckcts键值对中的vector<int> 的第一个和最后一个index
c++ unordered_map 判断某个键是否存在
find函数。
iterator find ( const key_type& key );
如果key存在,则find返回key对应的迭代器,如果key不存在,则find返回unordered_map::end。因此可以通过
map.find(key) == map.end()
来判断,key是否存在于当前的unordered_map中
Count函数
size_type count ( const key_type& key ) const
count函数用以统计key值在unordered_map中出现的次数。实际上,c++ unordered_map不允许有重复的key。因此,如果key存在,则count返回1,如果不存在,则count返回0.
2, vector
vector几乎大部分题目都有涉及,就不做题型分析,只更新用到的方法
vector<int> ans;
ans.size()表示vector当前的大小
ans.insert(被插入的位置index,插入的值)
ans.insert(被插入的位置index,插入几个这样的值,插入的值)
模板和迭代器配合之后的用法
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last); (C++11 前)
template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );
// 模板函数 first 和 last 两个迭代器中的数据 为要插入的数据。
3. LinkedList
LinkedList题目中如果返回的还是LinkedList, 一般套路是要自己建两个ListNode, 一个是head, 一个是结果。比如:
ListNode* head = new ListNode(0)
ListNode* result = head
注意当前链表不能为nullptr。然后迭代到下一个指针的时候也要判断不能为nullptr.
return 的结果是result->next