c++STL基本使用入门
2015-02-03 10:38
411 查看
vector(向量容器)的基本使用入门: | |
简介 | vector 的特点: (1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组 一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。 (2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at() (3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是 要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的。 (4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。 Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现 是按照顺序表的原理。 (5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop 。 (6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷 贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创 建vector 时就指定其空间大小。 Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的 任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的 元素所处的位置或是在Vector中插入元素则是线性时间复杂度。 基本方法: 1.at() 返回指定位置的元素 语法: TYPE at( size_type loc ); //差不多等同v[i];但比v[i]安全; 2.back() 返回最末一个元素 3.begin() 返回第一个元素的迭代器 4.capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下) 5.clear() 清空所有元素 6.empty() 判断Vector是否为空(返回true时为空) 7.end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置) 8.erase() 删除指定元素 语法: iterator erase( iterator loc ); //删除loc处的元素 iterator erase( iterator start, iterator end ); //删除start和end之间的元素 9.front() 返回第一个元素的引用 10.get_allocator() 返回vector的内存分配器 11.insert() 插入元素到Vector中 语法: iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, void insert( iterator loc, size_type num, const TYPE &val ); //在指定位置loc前插入num个值为val的元素 void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入区间[start, end)的所有元素 12.max_size() 返回Vector所能容纳元素的最大数量(上限) 13.pop_back() 移除最后一个元素 14.push_back() 在Vector最后添加一个元素 15.rbegin() 返回Vector尾部的逆迭代器 16.rend() 返回Vector起始的逆迭代器 17.reserve() 设置Vector最小的元素容纳数量 //为当前vector预留至少共容纳size个元素的空间 18.resize() 改变Vector元素数量的大小 语法: void resize( size_type size, TYPE val ); //改变当前vector的大小为size,且对新创建的元素赋值val 19.size() 返回Vector元素数量的大小 20.swap() 交换两个Vector 语法: void swap( vector &from ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <vector> using namespace std; struct Teacher { char name[20]; int age; }; void printfA(vector< int > &tmp){ int size = tmp.size(); for ( int i = 0; i < size;i++) { cout <<tmp[i] << "," ; if (i+1==size) { cout <<endl; } } } void main() { //vector是一个模板类 在使用模板类的时候需要指明具体的类型 vector< int >v1(5); //相当于int v1[5] //赋值打印 cout << "vector赋值打印:" << endl; for ( int i = 0; i < 5;i++) { v1[i] = i + 1; cout <<v1[i] << endl; } //类做函数参数 vector< int >v2(20); v2 = v1; cout << "类做函数参数:" << endl; printfA(v2); vector< int >v3(20); v3.push_back(100); //push_back会在类结尾进行添加新的数值,并且会将前面的二十个元素进行初始化 printfA(v3); //初始化Teacher结构体 Teacher t1, t2; t1.age = 10; strcpy (t1.name, "张锋" ); t2.age = 20; strcpy (t2.name, "柴宇婷" ); //声明一个Teacher类型的vector模板类 vector<Teacher> vTeacher(5); vTeacher[0] = t1; vTeacher[1] = t2; cout << "Teacher类型的vector模板:" << vTeacher[0].age << "---" << vTeacher[2].age << endl; //v声明一个 Teacher * 类型的vector模板类 vector<Teacher *> vTeacherPoint(5); vTeacherPoint[0] = &t1; vTeacherPoint[1] = &t2; cout << "打印指针类型vector:" << endl; int vTeacherPointSize = vTeacherPoint.size(); for ( int i = 0; i < vTeacherPointSize; i++) { Teacher *temp = vTeacherPoint[i]; if (temp != NULL) { cout << "第" << i + 1 << "个老师的年龄为:" << temp->age << " 名字为:" << temp->name << endl; } } system ( "pause" ); } |
stack(栈)的基本使用入门: | |
简介 | C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,— —也就是说实现了一个先进后出(FILO)的数据结构。 1.empty() 堆栈为空则返回真 2.pop() 移除栈顶元素 3.push() 在栈顶增加元素 4.size() 返回栈中元素数目 5.top() 返回栈顶元素 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #include <iostream> #include <stack> using namespace std; struct Teacher { int age; char name[20]; }; void printfStack(stack< int > &tmp){ while (!tmp.empty ()) { cout <<tmp.top() << endl; tmp.pop(); } } void main(){ //声明一个stack类型的容器 stack< int > s1; //栈是先进后出 //循环添加元素 for ( int i = 0; i < 5; i++) { s1.push(i + 1); } //1.0通过指针做函数参数进行传参 cout << "通过指针调用 演示:" << endl; printfStack(s1); //2.0遍历站内元素 while (!s1.empty ()) { cout <<s1.top() << endl; //获取栈顶元素 s1.pop(); //弹出栈顶元素 } //3.0放Teacher cout << "Teacher 演示:" << endl; stack<Teacher> sTeacher; Teacher t; for ( int i = 0; i < 5;i++) { t.age = i+20; sTeacher.push(t); } while (!sTeacher.empty ()) { cout <<sTeacher.top().age << endl; sTeacher.pop(); } //4.0放Teacher * cout << "Teacher * 演示:" << endl; stack<Teacher *> sTeacherPoint; Teacher t1,t2,t3; t1.age = 20; t2.age = 21; t3.age = 22; sTeacherPoint.push(&t1); sTeacherPoint.push(&t2); sTeacherPoint.push(&t3); while (!sTeacherPoint.empty ()) { //Teacher * tmp = sTeacherPoint.top(); cout <<sTeacherPoint.top()->age << endl; sTeacherPoint.pop(); } system ( "pause" ); } |
Queues(队列)的基本使用入门: | |
简介 | C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。 1.back() 返回一个引用,指向最后一个元素 2.empty() 如果队列空则返回真 3.front() 返回第一个元素 4.pop() 删除第一个元素 5.push() 在末尾加入一个元素 6.size() 返回队列中元素的个数 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include <iostream> #include <queue> using namespace std; struct Teacher { int age; char name[20]; }; void printfQueue(queue<Teacher> &tmp){ while (!tmp.empty()) { cout <<tmp.front().age << endl; tmp.pop(); } } void main() { //1.0定义一个queue容易 cout << "基础演示 :" << endl; queue< int > q; for ( int i = 0; i < 5; i++) { q.push(i + 1); } int size = q.size(); for ( int i = 0; i < size; i++) { cout <<q.front() << endl; q.pop(); } //2.0放Teacher cout << "Teacher 演示:" << endl; queue<Teacher> qTeacher; Teacher t; for ( int i = 0; i < 2;i++) { t.age = 21 + i; qTeacher.push(t); } printfQueue(qTeacher); //4.0放Teacher * cout << "Teacher * 演示:" << endl; queue<Teacher *> qTeacherPoint; Teacher t1, t2, t3; t1.age = 20; t2.age = 21; t3.age = 22; qTeacherPoint.push(&t1); qTeacherPoint.push(&t2); qTeacherPoint.push(&t3); while (!qTeacherPoint.empty()) { //Teacher * tmp = sTeacherPoint.top(); cout <<qTeacherPoint.front()->age << endl; qTeacherPoint.pop(); } system ( "pause" ); } |
list(双向链表)的基本使用入门: | |
简介 | 是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个 信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定 的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指 针将有序的元素链接起来。 由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那 样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后, 它的检索时间就越长。检索时间与目标元素的位置成正比。 虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除 操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对 最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有 所影响,这一点是vector 不可比拟的。 list 的特点: (1) 不使用连续的内存空间这样可以随意地进行动态操作; (2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop 。 (3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ; Lists将元素按顺序储存在链表中,与向量(vectors)相比,它允许快速的插入 和删除,但是随机访问却比较慢. |
用法 | 1.assign() 给list赋值 语法: void assign( input_iterator start, input_iterator end ); //以迭代器start和end指示的范围为list赋值 void assign( size_type num, const TYPE &val ); //赋值num个以val为值的元素。 2.back() 返回最后一个元素的引用 3.begin() 返回指向第一个元素的迭代器 4.clear() 删除所有元素 5.empty() 如果list是空的则返回true 6.end() 返回末尾的迭代器 7.erase() 删除一个元素 语法: iterator erase( iterator loc );//删除loc处的元素 iterator erase( iterator start, iterator end ); //删除start和end之间的元素 8.front() 返回第一个元素的引用 9.get_allocator() 返回list的配置器 10.insert() 插入一个元素到list中 语法: iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, void insert( iterator loc, size_type num, const TYPE &val ); //定位置loc前插入num个值为val的元素 void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入区间[start, end)的所有元素 11.max_size() 返回list能容纳的最大元素数量 12.merge() 合并两个list 语法: void merge( list &lst );//把自己和lst链表连接在一起 void merge( list &lst, Comp compfunction ); //指定compfunction,则将指定函数作为比较的依据。 13.pop_back() 删除最后一个元素 14.pop_front() 删除第一个元素 15.push_back() 在list的末尾添加一个元素 16.push_front() 在list的头部添加一个元素 17.rbegin() 返回指向第一个元素的逆向迭代器 18.remove() 从list删除元素 语法: void remove( const TYPE &val ); //删除链表中所有值为val的元素 19.remove_if() 按指定条件删除元素 20.rend() 指向list末尾的逆向迭代器 21.resize() 改变list的大小 语法: void resize( size_type num, TYPE val ); //把list的大小改变到num。被加入的多余的元素都被赋值为val22. 22.reverse() 把list的元素倒转 23.size() 返回list中的元素个数 24.sort() 给list排序 语法: void sort();//为链表排序,默认是升序 void sort( Comp compfunction );//采用指定函数compfunction来判定两个元素的大小。 25.splice() 合并两个list 语法: void splice( iterator pos, list &lst );//把lst连接到pos的位置 void splice( iterator pos, list &lst, iterator del );//插入lst中del所指元素到现链表的pos上 void splice( iterator pos, list &lst, iterator start, iterator end );//用start和end指定范围。 26.swap() 交换两个list 语法: void swap( list &lst );// 交换lst和现链表中的元素 27.unique() 删除list中重复的元素 语法: void unique();//删除链表中所有重复的元素 void unique( BinPred pr );// 指定pr,则使用pr来判定是否删除。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <iostream> #include <list> using namespace std; struct Teacher { int age; char name[20]; }; void main () { //1.0定义list容器 list< int > l; for ( int i = 0; i < 5; i++) { l.push_back(i + 1); } cout << "list数量:" << l.size() << endl; //2.0定义一个迭代器 指向第一个元素 list< int >::iterator cur = l.begin(); while (cur!=l.end ()) { cout <<*cur << endl; cur++; } //3.0插入元素 cout << "------------插入一个元素------------" << endl; cur = l.begin(); cur++; cur++; l.insert(cur, 100); for (list< int >::iterator p = l.begin(); p != l.end();p++) { cout <<*p << endl; } //4.0list放Teacher cout << "------------list放Teacher------------" << endl; list<Teacher> lTeacher; Teacher t1, t2; t1.age = 10; t2.age = 20; lTeacher.push_back(t1); lTeacher.push_back(t2); for (list<Teacher>::iterator p = lTeacher.begin(); p != lTeacher.end(); p++) { cout <<p->age << endl; } //5.0list放Teacher * cout << "------------list放Teacher *------------" << endl; list<Teacher *> lTeacherPoint; lTeacherPoint.push_back(&t1); lTeacherPoint.push_back(&t2); for (list<Teacher *>::iterator p = lTeacherPoint.begin(); p != lTeacherPoint.end();p++) { Teacher *tmp = *p; cout <<tmp->age << endl; } system ( "pause" ); } |
迭代器: |
迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭 代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器 是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器。然而迭代 器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。 迭代器提供一些基本操作符:*、++、==、! =、=。这些操作和C/C++“操作 array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的smart pointers, 具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因 此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器 以嵌套的方式定义于内部。因此各种迭代器的接口相同,型别却不同。这直接导 出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。 迭代器使开发人员不必整个实现类接口。只需提供一个迭代器,即可遍历类 中的数据结构,可被用来访问一个容器类的所包函的全部元素,其行为像一个指 针,但是只可被进行增加(++)或减少(--)操作。举一个例子,你可用一个迭代器 来实现对vector容器中所含元素的遍历。 如下代码对vector容器对象生成和使用了迭代器: vector< int > the_vector; vector< int >::iterator the_iterator; for ( int i = 0; i < 10; i++) the_vector.push_back(i); int total = 0; the_iterator = the_vector.begin(); while (the_iterator != the_vector.end()) { total += *the_iterator; the_iterator++; } cout << "Total=" << total << endl; 提示:通过对一个迭代器的解引用操作(*),可以访问到容器所包含的元素。 |
相关文章推荐
- C++ STL入门教程(3)——deque(双向队列)的使用(附完整程序代码)
- C++ STL入门教程(5)——map(关联数组)的使用(附完整程序代码)
- C++ 【STL】 map的基本操作和使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL入门教程(4)——stack(栈),queue(队列),priority_queue(优先队列)的使用(附完整程序代码)
- C++ STL入门教程(3)——deque(双向队列)的使用(附完整程序代码)
- c++STL基本使用
- C++ STL基本容器的使用
- C++ STL基本容器的使用
- C++ STL入门教程(3)——deque(双向队列)的使用(附完整程序代码)
- C++ STL入门教程(1)——vector(向量容器)的使用(附完整程序代码)
- C++ STL入门教程(7)——multimap(一对多索引),multiset(多元集合)的使用(附完整程序代码)
- C++ STL基本容器的使用
- C++ STL入门教程(1)——vector(向量容器)的使用(附完整程序代码)
- C++ STL入门教程(4)——stack,queue,priority_queue的使用(附完整程序代码)
- C++ STL基本容器的使用
- [C++][STL][map]C++ map的基本操作和使用
- C++ STL基本容器使用
- C++ STL 基本容器使用