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;
posted @ 2019-10-08 11:03  帅气好男人_jack  阅读(7)  评论(0编辑  收藏  举报  来源