c++stl容器用法

vector

vector(向量):是一种顺序容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而vector正好弥补了这个缺陷,它的特征是相当于可分配拓展的数组,它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。

  • vector初始化

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kg6NLfiu-1600865876914)(https://i.loli.net/2020/09/22/4kawGFDzU653sSX.png)]

  • vector操作

    vector<int> v1;
    v1.push_back() //在数组的最后添加一个数据
    v1.pop_back() //去掉数组的最后一个数据
    v1.front() //返回第一个元素(栈顶元素)
    v1.begin() //得到数组头的指针,用迭代器接受
    v1.end() //得到数组的最后一个单元+1的指针,用迭代器接受
    v1.clear() // 移除容器中所有数据
    v1.empty() //判断容器是否为空
    v1.erase(pos) //删除pos位置的数据,指针依旧指着该位置
    v1.erase(beg,end)// 删除[beg,end)区间的数据
    v1.size() //回容器中实际数据的个数
    v1.insert(pos,data) //在pos位置前插入数据
    

    使用迭代器遍历的方式

    vector<string> v6 = { "hi","my","name","is","lee" };
    for (vector<string>::iterator iter = v6.begin(); iter != v6.end(); iter++)
    {
        cout << *iter << endl;
        //下面两种方法都行
        cout << (*iter).empty() << endl;
        cout << iter->empty() << endl;
    }
    

List

顺序容器,List的优势在于可以在常规时间内,在序列已知的任何位置删除和插入数据,而缺点则是无法通过位置索引来直接访问已存储的数据。

  • list初始化

    list<int> lst1; //创建空list
    list<int> lst2(3); //创建含有三个元素的list
    list<int> lst3(3,2); //创建含有三个元素的值为2的list
    list<int> lst4(lst2); //使用lst2初始化lst4
    list<int> lst5(lst2.begin(),lst2.end()); //同lst4
    
  • list操作

    // 添加元素
    list<int> lst1;   
    lst1.push_front(val);  // 在链表的首部添加元素val,即val所在结点为list5的头结点
    lst1.push_back(val);  // 在链表的尾部添加元素val, 即list5的最后一个结点后向指针指向val所在结点
    lst1.emplace_front(val); // 同push_front()
    lst1.emplace_back(val);  // 同epush_back() 但效率更高
    // 插入元素
    list5.insert(list5.begin()+1, 2, 5);//在list5的第二个位置插入2个5
    list5.insert(list5.begin()+1, 5);//在list5的第二个位置插入5
    // 删除元素
    list5.unique();     // 删除list5中重复元素
    list5.pop_front();  // 删除list5的头结点
    list5.pop_back();   // 删除list5的尾结点
    list5.remove(val);  // 删除list5中元素等于val的结点
    list5.remove_if([](int n){return n%2 == 0;});  // 删除元素值为偶数的结点
    list5.erase(list5.begin()+2); // 删除第3个元素 
    list5.clear();
    
    lst1.begin(); //返回首值的迭代器
    lst1.end(); //返回尾值的迭代器
    lst1.clear(); //清空值
    lst1.empty(); //判断为空
    lst1.front(); //返回第一个元素的引用
    lst1.back(); //返回最后一个元素的引用
    lst1.rbegin(); //返回第一个元素的前向指针
    lst1.reverse(); //反转
    lst1.size(); //含有元素个数
    lst1.sort(); //排序
    lst1.unique(); //删除相邻重复元素
    

stack

容器修饰器

  • stack用法

    stack<int> s;
    s.empty() // 堆栈为空则返回真
    s.pop() // 移除栈顶元素
    s.push() // 在栈顶增加元素 
    s.size() // 返回栈中元素数目 
    s.top() // 返回栈顶元素
    

queue

容器修饰器

  • queue用法

    queue<int> q;
    q.push(x); // 将x接到队列的末端。
    q.pop(); // 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
    q.front(),// 最早被压入队列的元素。
    q.back(),// 最后被压入队列的元素。
    q.empty(),// 当队列空时,返回true。
    

priority_queue

容器修饰器,相比于queue,不同的地方在于,插入的元素都是有序的。

  • 优先队列用法

    // Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)
    priority_queue<Type, Container, Functional>
    // 升序队列
    priority_queue <int,vector<int>,greater<int> > q;
    // 降序队列
    priority_queue <int,vector<int>,less<int> >q;
    
    

set

关联容器,set跟vector差不多,它跟vector的唯一区别就是,set里面的元素是有序的且唯一的,只要你往set里添加元素,它就会自动排序。可以使用迭代器遍历

  • set初始化

    set<int> a; // 定义一个int类型的集合a
    set<int> b(a); // 定义并用集合a初始化集合b
    set<int> b(a.begin(), a.end()); // 将集合a中的所有元素作为集合b的初始值
    
  • set操作

    set<int> s;
    s.begin(); // 返回指向第一个元素的迭代器
    s.clear(); // 清除所有元素
    s.count(x); // 返回某个值元素的个数
    s.empty(); // 如果集合为空,返回true
    s.end(); // 返回指向最后一个元素的迭代器
    s.erase(x); // 删除集合中的元素
    s.find(x); // 返回一个指向被查找到元素的迭代器,不存在返回s.end()
    s.insert(x); // 在集合中插入元素
    s.lower_bound(); // 返回指向大于(或等于)某值的第一个元素的迭代器
    s.rbegin(); // 返回指向集合中最后一个元素的反向迭代器
    s.rend(); // 返回指向集合中第一个元素的反向迭代器
    s.size(); // 集合中元素的数目
    s.swap(s1); // 交换两个集合变量
    s.upper_bound(); // 返回大于某个值元素的迭代器
    
    // 自定义排序
    set<int, myComp> s1;
    

unordered_set

基于于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能可以使用迭代器遍历

map

关联容器,map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。可以使用迭代器遍历

  • map的操作
map<int, string> mapStudent;
 
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
 
// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));
 
// 第三种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

// 查找
// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

// 自定义比较函数
struct cmp_key
{
    bool operator()(const A &k1, const A &k2)const
    {
        if(k1.value != k2.value)
        {
            return k1.dwBussID < k2.dwBussID;
        }
    }
};

map<A, A, cmp_key> a;
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页