C++中的vector、list和vector的区别、set的用法与区别以及迭代器iterator
vector封装数组,list封装了链表,map和set封装了二叉树
1.vector
初始化:vector<int> test vector<int> test(n,0) (n不用初始化,可cin输入或者读入文件) 初始化长度为n,元素值全部为0。
sort: sort(test.begin(),test.end()) //test中的元素按从小到大排列
#include <algorithm>
bool cmp(int a,int b){
return a>b;
}
sort(vec.begin(),vec.end()); // 按升序排序
sort(vec.begin(),vec.end(),cmp); // 按降序排序
find:查找某一元素最先出现的位置。用法:
vector<int>::iterator a=find(test.begin(),test.end(),a)
int index = distance(test.begin(),a); //index就是元素a在vector中的下标
插入元素:尾部插入:test.push_back(a); 在某一位置插入元素:vec.insert(vec.begin()+index,a); 在下标为index处插入a.
删除元素:尾部删除:test.pop_back(a); 删除某一位置的元素:vec.erase(vec.begin()+2); 删除下标为2的元素,即vec[2],且后面元素自动前移一个位置。 vec.erase(vec.begin()+i,vec.begin()+j); 删除区间[i,j-1]的元素;
2.vector和list的区别:
(1)vector拥有连续的内存空间,能高效的随机存取,时间复杂度为o(1)(test[1])。插入和删除元素时会造成内存块的拷贝,时间复杂度为o(n)。vector<int>::iterator支持“+”,“+=”,“<”等操作符。
(2)list是由双向链表实现的,内存空间不连续,只能通过指针访问数据,随机存取的时间复杂度为o(n),链表能高效的插入和删除元素。list的内存空间可以是不连续,它不支持随机访问,因此list<int>::iterator则不支持“+”、“+=”、“<”等。
因此,如果需要高效的随机存取,而不在乎插入和删除的效率,使用vector;如果需要大量的插入和删除,而不关心随机存取,则应使用list。
3.set (特点:每个元素的值是唯一的,自动进行升序排列,不需要内存拷贝和内存移动,元素以节点方式存储,节点结构类似链表) 头文件:#include<set>
初始化:set<int> a;
find: set<int>::iterator it=a.find(1); int index=distance(a.begin(),it); //在集合a中查找元素1的下标index。 set中的查找为二分查找。
插入元素:a.insert(插入的元素); set会自动排序,
删除元素:a.erase(5) //删除set中值为5的元素 a.erase(it) //删除迭代器it对应的元素
4.iterator:
迭代器实际上是对“遍历容器”这一操作进行了封装。在编程中我们往往会用到各种各样的容器,但由于这些容器的底层实现各不相同,所以对他们进行遍历的方法也是不同的。例如,数组使用指针算数就可以遍历,但链表就要在不同节点直接进行跳转。 指针能指向函数而迭代器不行,迭代器只能指向容器;指针是迭代器的一种。指针只能用于某些特定的容器;迭代器是指针的抽象和泛化。所以,指针满足迭代器的一切要求。
5.string
find: string a ="asdfkjl"; int index=a.find('k') //查找字符串a中字符‘k’的下标,找不到返回-1
插入元素:
末尾插入元素:a=a+'a' | a=a+"asfd";
在中间插入一个元素: a.insert(a.begin()+1,'a') //将元素‘a’插入字符串,下标为1
删除元素:
删除某个下标的元素: a.erase(a.begin()+1) //删除下标为1的元素
上一篇: javascript关键字是var吗
下一篇: es6继承和es5继承的区别是什么