vector
vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。
vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时
vector的构造函数
| vector(); |
| vector(initializer_list<_Ty> list); |
| vector(size_t size); |
| vector(size_t size, const Ty& val); |
| vector(Iter first, Iter last); |
| vector(const vector& _Right); |
| vector(vector&& _Right); |
代码示例:
| |
| |
| |
| vector<int> a{ 1,2,3,4,5,6 }; |
| const vector<int> b(5); |
| vector<int> c(10, 0); |
| vector<int> d(a.begin(), a.end()); |
| vector<int> e(a); |
| vector<int> f(b); |
vector元素访问
| Ty& operator[](size_t i); |
| Ty& at(size_t i); |
| Ty& front(); |
| Ty& back(); |
| Ty* data(); |
代码示例:
| cout << a[0] << endl; |
| cout << a.at(5) << endl; |
| cout << a.front() << endl; |
| cout << a.back() << endl; |
| auto p = a.data(); |
vector容量相关
| size_t size(); |
| size_t max_size(); |
| size_t capacity(); |
| void reserve(size_t n); |
| void resize(size_t n); |
| void resize(size_t n,const Ty& val); |
| void clear(); |
| bool empty(); |
| void shrink_to_fit(); |
代码示例
| cout << a.size() << endl; |
| cout << a.max_size() << endl; |
| cout << a.capacity() << endl; |
| a.reserve(100); |
| cout << a.capacity() << endl; |
| a.resize(4); |
| a.resize(10, -99); |
| a.clear(); |
| cout << a.size() << endl; |
| cout << a.empty() << endl; |
| a.shrink_to_fit(); |
| cout << a.capacity() << endl; |
vector修改元素
| void push_back(const Ty& val); |
| void push_back(Ty&& val); |
| void emplace(Iter where,_Valty&& val); |
| void emplace_back(_Valty&& val) |
| void pop_back(); |
| |
| void assign(const size_t size, const Ty& val); |
| void assign(Iter First, Iter Last); |
| void assign(initializer_list<_Ty> Ilist); |
| |
| iter insert(iter _Where, const Ty& Val); |
| iter insert(iter _Where, const size_t Count, const Ty& val); |
| iter insert(iter _Where, Iter First, Iter Last); |
| iter insert(iter _Where, initializer_list<_Ty> Ilist); |
| |
| iterator erase(iter pos); |
| iterator erase(iter first,iterator last); |
| |
| void swap(vector& str); |
代码示例:
| vector<int> temp{ 9,8,7,6,5,4 }; |
| a.push_back(10); |
| a.pop_back(); |
| a.emplace(a.end(),10); |
| a.emplace_back(55); |
| a.assign(50, -99); |
| a.assign(b.begin(), b.end()); |
| |
| a.insert(a.begin(), 555); |
| a.insert(a.begin(), 10, 999); |
| a.insert(a.end(), temp.begin(), temp.end()); |
| a.insert(a.end(), { 1,2,3 }); |
| |
| a.erase(a.begin()); |
| a.erase(a.begin(), a.begin() + 9); |
| a.swap(temp); |
| |
| vector<int> null; |
| a.swap(null); |
注意:
vector容器的操作没有对于头部的操作,因为vector是单端数组
,对于头部的操作会导致后面一系列都发生变化,因此没有类似于pop_front和push_front的操作。
deque
deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
- deque 容器也擅长在序列尾部添加或删除元素(时间复杂度为
O(1)
),而不擅长在序列中间添加或删除元素。 - deque 容器也可以根据需要修改自身的容量和大小。
和 vector 不同的是,deque 还擅长在序列头部添加或删除元素,所耗费的时间复杂度也为常数阶O(1)
。并且更重要的一点是,deque 容器中存储元素并不能保证所有元素都存储到连续的内存空间中。
deque构造函数
| deque(); |
| deque(size_t count); |
| deque(size_t count, Ty& val); |
| deque(const deque& right); |
| deque(deque&& right); |
| deque(Iter first,Iter last); |
deque元素访问
| Ty& operator[](size_t i); |
| Ty& at(size_t i); |
| Ty& front(); |
| Ty& back(); |
deque容量相关
| size_t size(); |
| size_t max_size(); |
| void resize(size_t n); |
| void resize(size_t n,const Ty& val); |
| void clear(); |
| bool empty(); |
| void shrink_to_fit(); |
deque的修改元素
| void push_back(const Ty& val); |
| void push_back(Ty&& val); |
| void push_front(const Ty& val); |
| void push_front(Ty&& val); |
| |
| void emplace(Iter where,_Valty&& val); |
| void emplace_back(_Valty&& val); |
| void emplace_front(_Valty&& val) |
| void pop_back(); |
| |
| void assign(const size_t size, const Ty& val); |
| void assign(Iter First, Iter Last); |
| void assign(initializer_list<_Ty> Ilist); |
| |
| iter insert(iter _Where, const Ty& Val); |
| iter insert(iter _Where, const size_t Count, const Ty& val); |
| iter insert(iter _Where, Iter First, Iter Last); |
| iter insert(iter _Where, initializer_list<_Ty> Ilist); |
| |
| iterator erase(iter pos); |
| iterator erase(iter first,iterator last); |
| |
| void swap(vector& str); |
注意:deque的操作跟vector的操作基本一致,只不过deque是双端数组
,因此对于头尾的操作速度都可以,因此它支持对头部的操作,如pop_front和push_front。
list
list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。
list构造函数
| list(); |
| list(size_t count); |
| list(size_t count,const Ty& val); |
| list(const list& right); |
| list(list&& right); |
| list(Iter first,Iter last); |
代码示例:
| list<int> a{ 1,2,3,4,5,6,7,8,9 }; |
| list<int> b(a.begin(), a.end()); |
| list<int> c(10); |
| list<int> d(10,-999); |
list元素访问
list容量相关
| bool empty(); |
| size_t size(); |
| size_t max_size(); |
| void resize(size_t n); |
| void resize(size_t n,const Ty& val); |
list添加元素
| void push_back(Ty& val); |
| void push_front(Ty& val); |
| void emplace_back(Args&&... args); |
| void emplace_front(Args&&... args); |
| Iter emplace(Iter pos,Args&&...args); |
| |
| void assign(const size_t size, const Ty& val); |
| void assign(Iter First, Iter Last); |
| void assign(initializer_list<_Ty> Ilist); |
| |
| iter insert(iter _Where, const Ty& Val); |
| iter insert(iter _Where, Ty&& Val); |
| iter insert(iter _Where, const size_t Count, const Ty& val); |
| iter insert(iter _Where, Iter First, Iter Last); |
| iter insert(iter _Where, initializer_list<_Ty> Ilist); |
list删除元素
| iterator erase(iter pos); |
| iterator erase(iter first,iterator last); |
| |
| void pop_front(); |
| void pop_back(); |
| void clear(); |
list的其他操作
| |
| void splice (Iter where, list& x); |
| void splice (Iter where, list& x, Iter first); |
| void splice (Iter where, list& x,Iter first, Iter last); |
| void remove(const Ty& val); |
| template<typename Predicate> |
| void remove_if(Predicate pred); |
| void unique(); |
| template <class Predicate> |
| void unique(Predicate _Pred); |
| void merge(list& right); |
| void sort(); |
| void sort(Predicate _Pred); |
| void reverse(); |
代码示例:
| class Foo{ |
| public: |
| bool operator()(const int& data){ |
| return data % 2 != 0; |
| } |
| }; |
| list<int> temp{1,2,3,4,5,6}; |
| list<int> temp2(temp); |
| a.splice(a.begin(),temp); |
| |
| a.splice(a.begin(), temp2, --temp2.end()); |
| |
| |
| |
| |
| a.remove(6); |
| |
| |
| a.remove_if([&](const int& data) {return data % 2 == 0; }); |
| |
| a.remove_if(Foo()); |
| |
| auto NotEqual = bind(equal_to<int>(), placeholders::_1, 5); |
| a.remove_if(NotEqual); |
| |
| list<int> unq{ 1,1,2,3,3,4,4,5,6,6,7,8,8 }; |
| |
| |
| auto it=unique(unq.begin(), unq.end(),bind(equal_to<int>(),placeholders::_1,placeholders::_2)); |
| |
| unq.erase(it, unq.end()); |
| |
| |
| a.sort(less<>()); |
| unq.merge(a); |
| unq.sort(); |
| unq.reverse(); |
forward_list
forward_list构造函数
| forward_list(); |
| forward_list(size_t count); |
| forward_list(size_t count,const Ty& val); |
| forward_list(const list& right); |
| forward_list(list&& right); |
| forward_list(Iter first,Iter last); |
forward_list迭代器
forward_list元素访问
forward_list容量相关
| bool empty(); |
| size_t max_size(); |
forward_list添加元素
| void push_front(Ty& val); |
| void emplace_front(Args&&... args); |
| Iter emplace_after(Iter where,Args&&...args); |
| |
| void assign(const size_t size, const Ty& val); |
| void assign(Iter First, Iter Last); |
| void assign(initializer_list<_Ty> Ilist); |
| |
| iter insert_after(iter _Where, const Ty& Val); |
| iter insert_after(iter _Where, const size_t Count, const Ty& val); |
| iter insert_after(iter _Where, Iter First, Iter Last); |
| iter insert_after(iter _Where, initializer_list<_Ty> Ilist); |
forward_list删除元素
| iterator erase_after(iter where); |
| iterator erase_after(iter first,iterator last); |
| |
| void pop_front(); |
| |
| void clear(); |
forward_list的其他操作
| |
| void splice (Iter where, list& x); |
| void splice (Iter where, list& x, Iter first); |
| void splice (Iter where, list& x,Iter first, Iter last); |
| |
| void remove(const Ty& val); |
| template<typename Predicate> |
| void remove_if(Predicate pred); |
| void unique(); |
| template <class Predicate> |
| void unique(Predicate _Pred); |
| |
| |
| void merge(list& right); |
| void sort(); |
| void sort(Predicate _Pred); |
| void reverse(); |
string
string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是用char表示的。string与char都可以用来表示字符串,那么二者有什么区别呢。
string和char*的比较
-
string是一个类, char*是一个指向字符的指针。
string封装了char*,管理这个字符串,是一个char*型的容器
-
string不用考虑内存释放和越界。
string管理char所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。
-
string提供了一系列的字符串操作函数(这个等下会详讲)
查找find,拷贝copy,删除erase,替换replace,插入insert
string的构造函数
| string(); |
| string(const char* ptr); |
| string(const string& right); |
| string(string&& right); |
| string(iter first,iter last); |
| string(const size_t count,const char c); |
| string(const char *ptr,size_t count); |
string的存取字符操作
| ostream& operator<<(ostream& out,string& right); |
| char& operator[](size_t off); |
| char& at(size_t off); |
| char& front(); |
| char& back(); |
string容量相关
| size_t size(); |
| size_t length(); |
| size_t max_size(); |
| size_t capacity(); |
| void reserve(size_t n); |
| void resize(size_t n,char c = '\0'); |
| void clear(); |
| bool empty(); |
| void shrink_to_fit(); |
string修改
| string& operator+=(string& right); |
| string& operator+=(char * str); |
| string& operator+=(char c); |
| |
| string& append(string& right); |
| string& append(string& right,size_t pos,size_t sublen = npos); |
| string& append(char *str); |
| string& append(char *str,size_t n); |
| string& append(size_t n,char c); |
| string& append(iter first,iter last); |
| |
| void push_back(char c); |
| |
| string& assign(...); |
| |
| string& insert(size_t pos,string& str); |
| |
| string& erase(size_t pos = 0,size_t len = npos); |
| iterator erase(iter p); |
| iterator erase(iter first,iterator last); |
| |
| |
| string& replace(size_t pos,size_t len,string &str); |
| string& replace(iter i1, iter i2, const string& str); |
| string& replace(size_t pos, size_t len, const string& str, |
| size_t subpos, size_t sublen); |
| string& replace(size_t pos, size_t len, const char* s); |
| string& replace(size_t pos, size_t len, const char* s, size_t n); |
| string& replace(iter i1, iter i2, const char* s, size_t n); |
| string& replace(size_t pos, size_t len, size_t n, char c); |
| string& replace(iter i1, iter i2, size_t n, char c); |
| |
| template <class Inputiter> |
| string& replace (iter i1, iter i2,Inputiter first, Inputiter last); |
| |
| |
| void swap(string& str); |
| void swap(string& left,string& right); |
| |
| void pop_back(); |
string操作
| const char* c_str(); |
| const char* data(); |
| size_t copy(char* s,size_t len,size_t pos = 0); |
| |
| |
| size_t find(const string& str, size_t pos = 0); |
| size_t find(const char* s, size_t pos = 0); |
| size_t find(const char* s, size_t pos, size_t n); |
| size_t find(char c, size_t pos = 0); |
| size_t rfind(...); |
| size_t find_first_of(...); |
| size_t find_last_of(...); |
| size_t find_first_of(...); |
| size_t find_last_of(...); |
| string substr(size_t pos=0,size_t len=npos); |
string静态成员
- npos是一个静态成员常量值,被定义为-1,但是size_t是unsigned int,值是最大值(4294967295)
- 用作字符串成员函数中len(或sublen)参数的值时,此值表示*“直到字符串结尾”*。
- 作为返回值,通常用于表示没有匹配项。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)