C++ STL

  • STL核心三组件:
    • 容器(Containers):比如 deque、list、vector、map 等。
    • 算法(Algorithms):包括对容器内容执行初始化、排序、搜索和转换等操作。
    • 迭代器(iterators):迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

 

  • 排序
// 对静态数组
int c[] = { 1, 2, 3, 4 };
sort(c, c + 4);

// 对vector
vector<int> a;
sort(a.begin(), a.end());

// 自定义“小于”
bool comp(const student &a, const student &b){
    return a.score < b.score;
}

vector<student> vectorStudents;
sort(vectorStudents.begin(),vectorStudents.end(),comp);

// set自动从小到大排序
// 对于某些无法确定大小的比较无法像sort函数那样传入自定义cmp
// 因此可以使用重载<符的方法
bool operator < (const student & stu1,const student &stu2){
    return stu1.score > stu2.score;
}

最简单的从大到小排序:rbegin rend

vector<int> v = {1,7,9,4,2,3,8};
sort(v.rbegin(), v.rend());
  • vector
#include <vector>
using namespace std;
// 初始化 // 用数组初始化 int n[] = {1, 2, 3, 4, 5} ; vector<int> a(n, n+5) ; vector<int> a(&n[1], &n[4]) ; // 转化成数组 float *buffer = new float[vecHeight.size()]; memcpy(buffer, &vecHeight[0], vecHeight.size()*sizeof(float)); // 其他 vector<int> a ; // 声明一个int型向量a vector<int> a(10) ; // 声明一个初始大小为10的向量 vector<int> a(10, 1) ; // 声明一个初始大小为10且初始值都为1的向量 vector<int> b(a) ; // 声明并用向量a初始化向量b vector<int> b(a.begin(), a.begin()+3) ; // 将a向量中从第0个到第2个(共3个)作为向量b的初始值 // 赋值 c.assign(n, elem); // 将n个elem的拷贝赋值给c c.assign(a.begin(), a.end()); // 可以用来做a的切片 // 遍历 vector<int>::iterator t; for(t=a.begin(); t!=a.end(); t++) cout<<*t<<" " ; // 基本操作 a.size(); // 获取向量中元素个数 c.capacity(); // 返回预分配的内存空间 a.empty(); // 是否为空 a.clear(); // 清空向量 a = b; // 复制 a == b; // 比较 // 也可以做大于小于等比较,取决于第一个不相等的元素 c.front(); // 传回第一个数据 // 插入 // 插入一个数到起始位置 a.insert(a.begin(), 1000); // 插入多个 a.insert(a.begin(), 3, 1000); b.insert(b.begin(), a.begin(), a.end()); // 删除 // 删除一个 b.erase(b.begin()); // 删除一段 b.erase(b.begin(), b.begin()+3); // 删除并返回最后一个 c.pop_back() // 交换 // a向量完全和b进行交换 b.swap(a); // 二维向量 // 十行五列 vector< vector<int> > b(10, vector<int>(5)); // 析构 c.~vector () // 销毁所有数据,释放内存
    • capacity和size不同,size是当前vector容器真实占用的大小,capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。
      • 每次size == capacity后再push_back,capacity会扩大原来的一半。capacity始终>=size
      • capacity对应reserve,修改capacity的大小
      • resize对应size,resize的尺寸小于原size则被截断,大于则补零。
      • 默认初始状态size和capacity都是0
    • vector::push_back() 的复杂度是分摊之后的 O(1)
  • map
#include <map>
using namespace std;

// 构造
map<int, string> mapStudent;


// 数据插入
// 1. insert pair数据 
mapStudent.insert(pair<int, string>(1, "student_one"));  

// 2. insert value_type数据
mapStudent.insert(map<int, string>::value_type (2, "student_two"));  

// 前两种方式如果key值已存在则插入不了,不会发生任何事
// 此时判定是否插入成功:
pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));
// 如果Insert_Pair.second为true则插入成功

// 3. 用map[key] = value赋值
mapStudent[3] = "student_three";  


// 遍历
// 用迭代器获取的数据类型是一个std::pair对象
for(map<int, stirng>::iterator it = mapStudent.begin(); it != mapStudent.end(); it++)
{
    cout<<iter->first<<' '<<iter->second<<endl;  
}
// 数组遍历
for(int nindex = 1; nindex <= nSize; nindex++)
    cout<<mapStudent[nindex]<<endl;


// 大小
mapStudent.size();


// 查找
mapStudent.count(1);  // 存在返回1,否则返回0
mapStudent.find(1);  // 存在返回key对应的指针(map::iterator 类型),否则返回mapStudent.end()


// 删除
// 1. 通过指针(迭代器)删除
map<int, string>::iterator iter;  
iter = mapStudent.find(1); 
mapStudent.erase(iter);  // 删除一个
mapStudent.erase( mapStudent.begin(), mapStudent.end() );  // 删除一片(前闭后开)
// 2. 通过关键字删除
int n = mapStudent.erase(1);  // 如果删除了会返回1,否则返回0  


// 交换swap
// 跟vector一样,两个map完整交换


// 排序
// map和set一样默认key从小到大排列,当出现无法排列的情况可以重载小于号
// 仿函数的应用
  • string
#include <string>
using namespace std;

// 构造
string s;  // 生成一个空字符串s
string s(str);  // 拷贝构造
string s = str;
string s(str, stridx);  // 将字符串str内“始于位置stridx”的部分当作字符串的初值
string s(str, stridex, strlen);  // 将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值
string s(cstr) //将C字符串作为s的初值 char cstr[] = "good!";
string s(chars,chars_len)  // 将C字符串前chars_len个字符作为字符串s的初值。
string s(num,c) //生成一个字符串,包含num个c字符
string s(str.begin(),str.end()) //以区间beg;end(不包含end)内的字符作为字符串s的初值


// 与C风格字符串转换
s.c_str();  // 生成一个const char*指针,指向以空字符终止的数组
s.copy(cstr, 3, 1);  //拷贝3个字符,从1个字符开始(位置下标从0开始),把字符串的内容复制或写入既有的c_string或字符数组内  // unsafe
s.data();  // 与c_str()类似,但是返回的数组不以空字符终止。


// 基本操作
s.size(); s.length(); // 等效
s.empty();
s[1];  // 下标访问


// 迭代
for (string::iterator it = str.begin(); it != str.end(); it++)
{
    cout << *it << endl;
}


// 交换
// 同vector


// 连接
s1 = s2 + s3;


// 查找
int index = s1.find("wbm", 0);  //位置下标从0开始 找不到返回-1
//查找每一次wbm出现的下标
int offindex = s1.find("wbm", 0);
while (offindex != string::npos)   //不等于-1
{
    cout << "offindex: " << offindex << endl;
    offindex++;
    offindex = s1.find("wbm", offindex);
}


// 替换
s1.replace(offindex, 3, "WBM");  // 从offindex位置开始,替换3位


// 插入
s1.insert(offindex, "AAA");


// 切片、提取子集
s.substr();  // 返回s的全部内容
s.substr(11);  // 从索引11往后的子串
s.substr(5,6);  // 从索引5开始6个字符


// 删除
// 删除一个
string::iterator it = find(s1.begin(), s1.end(), 'l');
s1.erase(it);
// 删除一片
s1.erase(s1.begin(), s1.end());


// 大小写转换
// transform(first,last,result,op);
transform(s1.begin(), s1.end(), s1.begin(), ::tolower);
transform(s1.begin(), s1.end(), s1.begin(), ::toupper);


// 销毁
s.~string();  // 销毁所有字符,释放内存
posted @ 2018-08-22 12:17  C2H5OHlife  阅读(94)  评论(0编辑  收藏  举报