C++ STL容器
STL简介
我们在学习C语言时,都有自己写过一些栈、链表等数据结构的集合,然而在C++里面,这些数据结构我们无需在自己实现,STL容器帮我们实现了许多数据结构,主要有以下:
- string
- vector
- list
- set
- map
- queue 先进先出队列
以vector为例来说
vector是以数组形式实现的一个可动态分配大小的数据,说道动态分配大小,就涉及到size和capacity两个属性,size表示vector内已有对象的数量,capacity表示vector预留的数量,以下是vector的一个简单的使用:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
cout << " size " << vec.size() << " capacity " << vec.capacity() << endl;
vec.push_back(0);
vec.push_back(1);
cout << " size " << vec.size() << " capacity " << vec.capacity() << endl;
vec.push_back(2);
cout << " size " << vec.size() << " capacity " << vec.capacity() << endl;
return 0;
}
输出结果:
size 0 capacity 0
size 2 capacity 2
size 3 capacity 4
push_back函数往vector尾添加数据;
insert函数向当前数据插入一个数据,插入数据在当前数据前面
resize重新规定vector大小,若当前vector已有数据小于resize大小,则为vector分配剩下的数据并赋值,若大于,将删除多余的数据
reserve重新规定预留的空间
vector遍历
方法一
可以使用数组形式vec[]去访问,当要防止数组越界,即不能超过size值
方法二
迭代器
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vec;
vec.push_back(0);
vec.push_back(1);
vec.push_back(2);
vector<int>::iterator it = vec.begin();
while(it != vec.end()){
cout << *it<<endl;
it++;
}
return 0;
}
输出:
0
1
2
vector特点,由于是数据形式实现的,所以在插入数据时,如果在尾巴上插入数据,只要还有预留空间即可,如果在中间就需要重新分配内存了,对于频繁插入删除需求的vector不太适用,而且在使用循环遍历vector,不要去修改vector内容
SortedVector:有序的vector数组
保存的成员需要实现操作符重载方法,如下:
struct CurvePoint
{
CurvePoint() {}
CurvePoint(int index, int attenuationInMb) :
mIndex(index), mAttenuationInMb(attenuationInMb) {}
uint32_t mIndex;
int mAttenuationInMb;
};
inline bool operator< (const CurvePoint &lhs, const CurvePoint &rhs)
{
return lhs.mIndex < rhs.mIndex;
}
SortedVector<CurvePoint> mCurvePoints;
这样Sorted才知道如何去排序
Set
set是有序而且元素唯一的集合,当插入相同数据时,不会在新加入一个数据,而且插入时会自动排序
List、map、string
list链表,就是链表的特性
map, key-value结构存储
string,字符串集合,值得注意的是,在使用+号进行字符串拼接时,+左右必须有一个string对象才行
map有两种结构:map和unordered_map,前者是以红黑树结构实现的,后者是以hash算法实现的;对于两种结构,他们有不同的特点:
map特点:
- 红黑树结构查找的平均时间复杂度O(log n),查找效率快
- map结构有序
- 不适合频繁的添加、删除操作,会导致红黑树结构频繁旋转
所以,map整体查找的效率取决于n的大小
unordered_map结构是哈系表结构,增删复杂度不稳定,平均复杂度O(n),取决于哈系函数
unordered_map API
unordered_map的迭代器是一个指针,指向这个元素,通过迭代器来取得它的值。
unordered_map<Key,T>::iterator it;
(*it).first; // the key value (of type Key)
(*it).second; // the mapped value (of type T)
(*it); // the "element value" (of type pair<const Key,T>)
iterator find ( const key_type& k );
查找key所在的元素。
- 找到:返回元素的迭代器。通过迭代器的second属性获取值
- 没找到:返回unordered_map::end
stringstream
stream有三个istringstream、ostringstream和stringstream分别是输入、输出和出入字符流,可以把stream看做一个容器,安全、直接,自动化完成转换;常用语数据类型转换,如下int和string转换
std::stringstream ss;
int num = 10;
std:string str;
ss << num;
ss >> str;