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的元素

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值