1 关联结构的底层构造及常用方法的复杂度
set:
底层红黑树,二叉搜索树,所以是有序的,可以在logN时间通过中序遍历找到元素。
插入、删除、查询复杂度:O(logN)
unordered_set:
底层:哈希表
count平均时间复杂度是O(1),find的时间复杂度为O(1);
map
底层红黑树,自动排序,额外空间稍小
插入、删除、查询复杂度:O(logN)
unordered_map
底层哈希表
count平均时间复杂度是O(1),find的时间复杂度为O(1);
2 set和map的区别
set和map都以RBTree作为底层容器
set:
所得元素的只有key没有value,value就是key
不允许出现键值重复
所有的元素都会被自动排序
不能通过迭代器来改变set的值,因为set的值就是键
map:
map的值不作为键,键和值是分开的,所有元素都是键+值存在
不允许键重复
所有元素是通过键进行自动排序的
map的键是不能修改的,但是其键对应的值是可以修改的
3 输入和输出
cin读入字符串不能读取空格
string str;
cin << str;
输入ab cd
str = “ab”
getline读取带空格的整行字符串
string str;
getline(cin, str);
输入ab cd
str = "ab cd"
cin.getline:接收一个字符串,可以接收空格并输出
读取5个数,只能显示4个数,最后一个为’\0’
char a[20];
cin.getline(a, 5);
for (int i = 0; i < 5; ++i) {
cout << a[i];
}
输入:ab cdef
读取后数组a前5项为'a' 'b' ' ' 'c' '\0'
输入和输出不用在意数据类型,例如
只要形式和输入输出一样就可以了
输入255.255.255.255可以用int和char组合输入
unsigned int n1, n2, n3, n4;
char ch;
while (cin >> n1 >> ch >> n2 >> ch >> n3 >> ch >> n4)
输出234.22可以
int a = 234, b = 22;
cout << a << '.' << b << endl;
4 链表输入样例
下面这个输入样例比较经典,请认真阅读注释。
几个技巧:
- 题目未说明“一个”统一用while输入。
- 只需要while ( cin >> 第一个参数),其他参数放到循环里。
- 特殊用例的考虑
- 不要在while里return 0, 否则只输出一行。
#include <iostream>
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int _val) : val(_val), next(nullptr) {};
};
int main() {
int n;
//除非说明一个,否则用while输入。
while (cin >> n) {
ListNode* dummy = new ListNode(-1);
ListNode* curr = dummy;
//输入过程中读取构建链表
for (int i = 0; i < n; ++i) {
int _val;
cin >> _val;
curr->next = new ListNode(_val);
curr = curr->next;
}
int k;
cin >> k;
ListNode* head = dummy->next;
//注意特殊用例,并且不能提前return 0,因为当连续输入前一组K = 0,后一组k != 0,这里return 0会导致后一组没结果,必须用if, else
if (k == 0) {
cout << 0 << endl;
//error : return 0;
}
else {
for (int i = 0; i < n - k; ++i) {
head = head->next;
}
cout << head->val << endl;
}
}
//return 0 写在while外面。
return 0;
}
5 pair中的iterator->first
参考文献
map/unordered_map存储pair<>类型。
其迭代器iter类似指针,*iter相当于这个pair。
(*iter).first = iter->first,这个first可以看做是指针指向对象的一个成员
和this->a , this->fun()类似。