C++进阶⑥:关联结构的底层构造及常用方法的复杂度、set和map的区别、C++ACM模式输入和输出、pair中的iterator->first

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可以用intchar组合输入
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 链表输入样例

下面这个输入样例比较经典,请认真阅读注释。
几个技巧:

  1. 题目未说明“一个”统一用while输入。
  2. 只需要while ( cin >> 第一个参数),其他参数放到循环里。
  3. 特殊用例的考虑
  4. 不要在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()类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值