From 44593ed7216e6002945fa38970ec4f4e7e5cdbd4 Mon Sep 17 00:00:00 2001 From: estomm Date: Mon, 19 Apr 2021 19:25:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=9D=A2=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- C++/标准库/2 容器.md | 5 ++ C++/面试/12.nullptr、NULL、0.md | 4 ++ test.cpp | 98 +++++++++++++++++++++++++++++++++ 操作系统/2.6 协程.md | 7 +++ 操作系统/面试问题整理.md | 18 ++++++ 5 files changed, 132 insertions(+) create mode 100644 test.cpp create mode 100644 操作系统/2.6 协程.md diff --git a/C++/标准库/2 容器.md b/C++/标准库/2 容器.md index f64f45ce..84784161 100644 --- a/C++/标准库/2 容器.md +++ b/C++/标准库/2 容器.md @@ -113,3 +113,8 @@ crbegin(),crend()|尾后迭代器。用来从后到前遍历元素。不可以 ![](image/2021-03-05-21-13-26.png) +## 容器删除问题 + +1. 对于序列容器vector,deque来说,使用erase(itertor)后,后边的每个元素的迭代器都会失效,但是后边每个元素都会往前移动一个位置,但是erase会返回下一个有效的迭代器; +2. 对于关联容器map set来说,使用了erase(iterator)后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素的,不会影响到下一个元素的迭代器,所以在调用erase之前,记录下一个元素的迭代器即可。 +3. 对于list来说,它使用了不连续分配的内存,并且它的erase方法也会返回下一个有效的iterator,因此上面两种正确的方法都可以使用。 \ No newline at end of file diff --git a/C++/面试/12.nullptr、NULL、0.md b/C++/面试/12.nullptr、NULL、0.md index c845a5db..1c5dcf5d 100644 --- a/C++/面试/12.nullptr、NULL、0.md +++ b/C++/面试/12.nullptr、NULL、0.md @@ -38,3 +38,7 @@ foo_t *f = NULL; ### C++中的nullptr * nullptr 关键字,被自动转换为各种pointer类型。但他不会不转换为任何整型类型。防止null作为参数的时候出现函数重载的错误。 + +### 主要区别 + +* nullptr关键字:nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型;而NULL一般被宏定义为0,在遇到重载时可能会出现问题。 \ No newline at end of file diff --git a/test.cpp b/test.cpp new file mode 100644 index 00000000..4ca0b40a --- /dev/null +++ b/test.cpp @@ -0,0 +1,98 @@ +#include +#include +#include +using namespace std; +struct ListNode{ + ListNode(int a){ + val = a; + } + ListNode* pre; + ListNode* next; + int val; +}; + +class Data{ +public: + ListNode* head; + ListNode* end; + map m; + int size; + + Data(){ + head = new ListNode(-1); + end = head; + size=0; + } + void set(int a){ + ListNode* temp; + if(size==4){ + temp = end; + end = end->pre; + m.erase(temp->val); + delete temp; + size--; + } + + + ListNode* n = new ListNode(a); + m[a]=n; + if(size==0){ + head->next =n; + n->pre=head; + end = n; + size=1; + } + else{ + temp = head->next; + head->next = n; + n->pre = head; + n->next = temp; + temp->pre = n; + size++; + } + + } + ListNode* get(int a){ + ListNode* temp = m[a]; + if(temp==head->next){ + return temp; + } + if(temp==end){ + end = end->pre; + } + temp->pre->next = temp->next; + temp->next->pre = temp->pre; + ListNode* n = head->next; + temp->next = n; + n->pre = temp; + head->next = temp; + temp->pre = head; + + return temp; + } + ListNode* get(){ + return head->next; + } + ~Data(){ + ListNode* temp=head; + while(temp!=nullptr){ + ListNode* n = temp; + delete n; + temp=temp->next; + } + } +}; +int main() { + Data data; + data.set(1); + cout<val<val<val<