首页 / 资讯中心 / 文章详情

c++STL——学习记录

c++STL——学习记录 ★ FEATURED ARTICLE
c学习记录课程是b站黑马程序员1vector容器嵌套#includeiostream using namespace std; #include vector //容器嵌套容器 void test01() { vector vectorintv; //创建小容器 vectorintv1; vectorintv2; vectorintv3; vectorintv4; //向小容器中添加数据 for(int i 0 ; i 4;i) { v1.push_back(i 1); v2.push_back(i 2); v3.push_back(i 3); v4.push_back(i 4); } //将小容器插入到大容器中 v.push_back(v1); v.push_back(v2); v.push_back(v3); v.push_back(v4); //通过大容器把所有数据遍历一遍 for (vector vectorint::iterator it v.begin(); it ! v.end(); it) { // (*it) ---- 容器 vectorint for (vectorint::iterator vit (*it).begin(); vit ! (*it).end(); vit) { cout *vit ; } cout endl; } } int main() { test01(); system(pause); return 0; }vectorvectorint v:容器v里面存放的是“只能存int数据类型的vector容器”v集装箱v里面有小盒子装着int苹果v.push_back(v1);v 是大容器它要求 push_back 进去的元素必须是 vectorint 类型vector vectorint ::iterator itit:指针是地址*it打开集装箱里面存放的是小盒子是vectorintfor (vectorint::iterator vit (*it).begin(); vit ! (*it).end(); vit)vit 是内层迭代器是地址*vit是某个int类型的元素(*it) 就是当前拿到的那个小盒子begin() 就是这个小盒子的第一个苹果盒子2vector构造函数完整代码#includeiostream using namespace std; #includevector void printVector(vectorintv) { for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } cout endl; } //vector容器构造 void test01() { vectorintv1; //默认构造 无参构造 for (int i 0; i 10; i) { v1.push_back(i); } printVector(v1); //通过区间方式进行构造 vectorintv2(v1.begin(), v1.end()); printVector(v2); //n个elem方式构造 vectorintv3(10, 100); printVector(v3); //拷贝构造 vectorintv4(v3); printVector(v4); } int main() { test01(); system(pause); return 0; }运行结果1默认构造vectorint v1告诉编译器装整数的容器名字叫v1现在什么都不放。2:区间构造vectorint v2(v1.begin(), v1.end())把另一个容器v1中从头到尾的所有元素拿过来初始化v23n个elem构造vectorint v3(10, 100)(数量, 值)10个100的数字初始化v34拷贝构造vectorint v4(v3)用v3的内容初始化v43vector赋值操作#includeiostream using namespace std; #include vector void printVector(vectorint v) { for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } cout endl; } //vector赋值 void test01() { vectorintv1; for (int i 0; i 10; i) { v1.push_back(i); } printVector(v1); //赋值 operator vector intv2; v2 v1; printVector(v2); // assign vectorintv3; v3.assign(v1.begin(), v1.end()); printVector(v3); //n个elem 方式赋值 vectorintv4; v4.assign(10, 100); printVector(v4); } int main() { test01(); system(pause); return 0; }1重载等号赋值vector intv2; // 1. 先创建一个空的容器 v2 v2 v1; // 2. 把 v1 的所有内容“抄”给 v2清空如果v2里面原本有数据编译器会先把它清空。深拷贝编译器会把v1里的数据完全复制一份放入v2的内存中2assign成员函数赋值vectorintv3; v3.assign(v1.begin(), v1.end());语法v3.assigna1a2参数传入两个迭代器左闭右开区间含义复制容器v1的全部内容给v33assign n个elem赋值vectorintv4; // 语法assign(数量, 值) v4.assign(10, 100);先创建容器v4复制10个100给v44vector容量大小#includeiostream using namespace std; #includevector void printVector(vectorintv) { for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } cout endl; } //vector容器的容量和大小操作 void test01() { vectorintv1; for (int i 0; i 10; i) { v1.push_back(i); } printVector(v1); if (v1.empty()) //为真 代表容器为空 { cout v1为空 endl; } else { cout v1不为空 endl; cout v1的容量为 v1.capacity() endl; cout v1的大小为 v1.size() endl; } //重新指定大小 v1.resize(15 , 100); //利用重载版本可以指定默认填充值参数2 printVector(v1);//如果重新指定的比原来长了默认用0填充新的位置 v1.resize(5); printVector(v1); //如果重新指定的比原来短了超出部分会删除掉 } int main() { test01(); system(pause); return 0; }5vector插入删除#includeiostream using namespace std; #include vector //vector插入和删除 /* - push_back(ele); //尾部插入元素ele - pop_back(); //删除最后一个元素 - insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele - insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele - erase(const_iterator pos); //删除迭代器指向的元素 - erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 - clear(); //删除容器中所有元素 */ void printVector(vectorintv) { for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } cout endl; } void test01() { vectorintv1; //尾插 v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push_back(40); v1.push_back(50); //遍历 printVector(v1); //尾删 v1.pop_back(); printVector(v1); //插入 第一个参数是迭代器 v1.insert(v1.begin(), 100); printVector(v1); v1.insert(v1.begin(), 2, 1000); printVector(v1); //删除 参数也是迭代器 v1.erase(v1.begin()); printVector(v1); //清空 //v1.erase(v1.begin(), v1.end()); v1.clear(); printVector(v1); } int main() { test01(); system(pause); return 0; }6vector数据存取#includeiostream using namespace std; #include vector //vector容器 数据存取 void test01() { vectorintv1; for (int i 0; i 10; i) { v1.push_back(i); } //利用[]方式访问数组中元素 for (int i 0; i v1.size(); i) { cout v1[i] ; } cout endl; //利用at方式访问元素 for (int i 0; i v1.size(); i) { cout v1.at(i) ; } cout endl; //获取第一个元素 cout 第一个元素为 v1.front() endl; //获取最后一个元素 cout 最后一个元素为 v1.back() endl; } int main() { test01(); system(pause); return 0; }7vector互换容器#includeiostream using namespace std; #include vector //vector容器互换 void printVector(vectorintv) { for (vectorint::iterator it v.begin(); it ! v.end(); it) { cout *it ; } cout endl; } //1、基本使用 void test01() { vectorintv1; for (int i 0; i 10; i) { v1.push_back(i); } cout 交换前 endl; printVector(v1); vectorintv2; for (int i 10; i 0; i--) { v2.push_back(i); } printVector(v2); cout 交换后 endl; v1.swap(v2); printVector(v1); printVector(v2); } //2、实际用途 //巧用swap可以收缩内存空间 void test02() { vectorintv; for (int i 0; i 100000; i) { v.push_back(i); } cout v的容量为 v.capacity() endl; cout v的大小为 v.size() endl; v.resize(3); //重新指定大小 cout v的容量为 v.capacity() endl; cout v的大小为 v.size() endl; //巧用swap收缩内存 vectorint(v).swap(v); cout v的容量为 v.capacity() endl; cout v的大小为 v.size() endl; } int main() { //test01(); test02(); system(pause); return 0; }vectorint(v).swap(v); 有收缩内存的作用相当于{ vectorint temp(v); // ① 拷贝构造一个新容器 temp.swap(v); // ② 交换两个容器的存储空间 } // ③ temp 析构释放原来的大块内存创建了临时容器复制了3个有效的元素然后进行容量跟大小的交换temp是临时的交换之后获得了较大的容量最后被释放了8vector预留空间reserve(int len); 容器预留len个元素长度预留位置不初始化元素不可访问。#includeiostream using namespace std; #include vector //vector容器 预留空间 void test01() { vectorintv; //利用reserve预留空间 // v.reserve(100000); int num 0; //统计开辟次数 int * p NULL; for (int i 0; i 100000; i) { v.push_back(i); if (p ! v[0]) { p v[0]; num; } } cout num num endl; } int main() { test01(); system(pause); return 0; }在没有使用reserve的情况下编译器会开辟30次内存才能存下100000个数据。内存开辟一次num增加1if (p ! v[0])只要重新开辟内存空间首地址就会改变所以p就不等于现在的首地址num次数增加一次。9MAP构造与赋值1所有的元素都是pair成对出现2第一个元素是key起到索引作用。第二个元素是value3所有元素按key自动排序key值不能重复优点可以根据key值找到value值函数1mapT1,T2 mp;默认构造函数T1key的类型是intT2value的类型是int2map(const map map);拷贝构造函数3:map operator(const map mp);重载等于号运算符#includeiostream using namespace std; #include map //map容器 构造和赋值 void printMap(mapint, intm) { for (mapint, int::iterator it m.begin(); it ! m.end(); it) { cout key (*it).first value it-second endl; } cout endl; } void test01() { //创建map容器 mapint, int m; m.insert(pairint, int(1, 10)); m.insert(pairint, int(3, 30)); m.insert(pairint, int(2, 20)); m.insert(pairint, int(4, 40)); printMap(m); //拷贝构造 mapint, intm2(m); printMap(m2); //赋值 mapint, intm3; m3 m2; printMap(m3); } int main() { test01(); system(pause); return 0; }代码中1m.insert(pairint, int(1, 10));map的元素成对出现第一个变量为first第二个是seconde。pair创建一个临时的成对 对象first是1seconde是10整体存入map容器里2插入顺序1 - 3 - 2 - 4m.insert(pairint, int(1, 10));m.insert(pairint, int(3, 30));m.insert(pairint, int(2, 20)); // 注意这里虽然是第3个插入的m.insert(pairint, int(4, 40));当你插入(3, 30)时它排在(1, 10)后面。当你插入(2, 20)时map发现 2 比 1 大但比 3 小。会自动把(2, 20)插在 1 和 3 中间。容器内部现在的顺序是Key: 1, 2, 3, 43(*it).firstit指向pair的地址*it拿到对象pair本体然后用.访问成员。10MAP大小与交换1size返回容器中元素的数目2empt判断容器是否为空3swapst交换两个容器#includeiostream using namespace std; #include map //map容器 大小和交换 //大小 void test01() { mapint, intm; m.insert(pairint, int(1, 10)); m.insert(pairint, int(2, 20)); m.insert(pairint, int(3, 30)); if (m.empty()) { cout m为空 endl; } else { cout m不为空 endl; cout m的大小为 m.size() endl; } } void printMap(mapint, intm) { for (mapint, int::iterator it m.begin(); it ! m.end(); it) { cout key it-first value it-second endl; } cout endl; } //交换 void test02() { mapint, intm; m.insert(pairint, int(1, 10)); m.insert(pairint, int(2, 20)); m.insert(pairint, int(3, 30)); mapint, intm2; m2.insert(pairint, int(4, 100)); m2.insert(pairint, int(5, 200)); m2.insert(pairint, int(6, 300)); cout 交换前 endl; printMap(m); printMap(m2); m.swap(m2); cout 交换后 endl; printMap(m); printMap(m2); } int main() { //test01(); test02(); system(pause); return 0; }11MAP插入与删除1insertelem在容器中插入元素2clear清除所有元素3erasepos清除pos迭代器所指的元素返回下一个元素的迭代器4erasebegend删除[begend的所有元素返回下一个元素的迭代器5erasekey清除容器中key值的元素#includeiostream using namespace std; #include map //map容器 插入和删除 void printMap(mapint, intm) { for (mapint, int::iterator it m.begin(); it ! m.end(); it) { cout key it-first value it-second endl; } cout endl; } void test01() { mapint, intm; //插入 //第一种 m.insert(pairint, int(1, 10)); //第二种 m.insert(make_pair(2, 20)); //第三种 m.insert(mapint, int::value_type(3, 30)); //第四种 m[4] 40; //[]不建议插入用途 可以利用key访问到value //cout m[4] endl; printMap(m); //删除 m.erase(m.begin()); printMap(m); m.erase(3); //按照key删除 printMap(m); //清空 //m.erase(m.begin(), m.end()); m.clear(); printMap(m); } int main() { test01(); system(pause); return 0; }12MAP查找与统计1findkey查找key是否存在若存在返回该key元素的迭代器若不存在返回set.send2countkey统计key的元素个数返回0或者1#includeiostream using namespace std; #include map //map容器 查找和统计 void test01() { //查找 mapint, intm; m.insert(pairint, int(1, 10)); m.insert(pairint, int(2, 20)); m.insert(pairint, int(3, 30)); m.insert(pairint, int(3, 40)); mapint,int::iterator pos m.find(3); if (pos ! m.end()) { cout 查到了元素 key (*pos).first value pos-second endl; } else { cout 未找到元素 endl; } //统计 //map不允许插入重复key 元素 count统计而言 结果要么是0 要么是1 //multimap的count统计可能大于1 int num m.count(3); cout num num endl; } int main() { test01(); system(pause); return 0; }13MAP排序map容器默认排序规则为 按照key值进行 从小到大排序掌握如何改变排序规则写仿函数改变排序规则仿函数知识点1在类里面重载了从操作符这个类的对象就可以像函数一样被调用因为他模仿了函数的行为所以被称为仿函数平时我们写mapint, int m;时编译器其实偷懒了它默默帮你补全了第三个参数。默认写法mapint, int, lessint m;lessint是 C 内置的一个规则意思是“左边 右边”为真。导致结果是升序1, 2, 3...。你的写法mapint, int, MyCompare m;你告诉编译器“别用默认的那套规则了用我写的MyCompare规则来排队。”class MyCompare { public: // 这是一个重载了 () 操作符的函数 // 这种重载了 () 的类产生的对象就像一个函数一样我们叫它“仿函数” bool operator()(int v1, int v2) { // 降序逻辑让大的排在前面 return v1 v2; } };operator会返回0或者1map会不停的问MyComparev1应该排在v2前面吗operator()(5, 2)52会返回1为真map就认为5应该排在2前面。
阅读完成 · 觉得有帮助?
咨询建站