【C++】STL之容器:vector、set、map

不定长数组vector

什么是vector?

vector即STL中的动态数组,是C++中的模板类,和C语言中的数组差不多,但是里面封装了很多现成的方法,使用起来非常方便。

vector中都有哪些常用方法?

建立vector:

vector的建立采用了泛型的形式:

  • vector< variable type > ans; //初始化时不定义大小
  • vector< variable type > ans(length); //初始化时定义大小
  • vector< variable type> ans; //初始化时不定义大小但是之后重新分配大小。
    ans.resize(n);
  • vector< >variable type>ans(100, 9); //初始化时定义长度100且将所有元素都初始化为9.

注意,vector在定义时不初始化也会默认里面的元素为0,所以不会出现C语言中由于数组未初始化而引起的蜜汁错误 ?。

添加元素:
  • ans.push_back(variable); //在末尾添加一个元素。
  • ans.insert(pos, elem); //在pos位置插入一个elem拷贝,传回新数据位置
  • ans.insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值
  • ans.insert(pos, begin, end); //在pos位置插入在[begin, end)区间的数据,无返回值
删除元素
  • ans.erase(pos); // 删除pos位置的元素,返回下一个元素的位置。
  • ans.erase(beg, end); //删除区间[begin, end)范围内得数据,传回下一个数据的位置。
  • ans.erase(ans.begin() + 2); // 删除ans[2]的数据。
  • ans.erase(ans.begin() + 2, v.begin() + 5); //删除ans[2],ans[3],ans[4]。
  • ans.pop_back(); //删除最后一个位置的数据。
  • ans.clear(); //清空整个容器
查询元素
  • ans.begin(); //返回第一个元素的位置.
  • ans.end(); // 返回最后一个元素的后一个位置,即一个不存在的元素.
  • ans.front(); //传回第一个数据.
  • ans.rbegin(); //传回一个逆向队列的第一个数据(正向队列的最后一个数据)
  • ans.rend(); //传回一个逆向队列的最后一个数据的下一个位置(正向队列的第一个数据)
统计数据
  • ans.max_size(); //返回容器中最大数据的数量
  • c.capacity();  //返回容器中数据个数。
  • c.empty(); //统计容器是否为空

常用方法示例:

【C++】STL之容器:vector、set、map_第1张图片
【C++】STL之容器:vector、set、map_第2张图片
注意:
特别注意!

例题

集合:set

什么是set?

set是一个集合,并且这个集合中的每个元素各不相同,集合中的元素按照从小到大的升序排序.

定义set:
  • set< int > ans;
插入元素:
  • ans.insert(n); //将n插入到集合中
查找元素:
  • ans.begin(); //返回指向第一个元素的迭代器
  • ans.equal_range(n); //返回集合中与给定值相等的上下限的两个迭代器.
  • ans.find(n); // 返回一个指向被查找元素的迭代器。如果ans.find == ans.end();则表示没找到,返回指向末尾的迭代器
  • ans.lower_bound(n); // 返回指向大于(或等于)某值的第一个元素的迭代器。(最小上界, >=给定元素的位置)
  • ans.upper_bound(n); // 返回大于某个值元素的迭代器。(上界, >给定元素的位置)
  • ans.value_comp(); //返回一个用于比较元素间值的函数.
  • ans.rbegin(); // 返回指向集合中最后一个元素的迭代器。
  • ans.end(); // 返回指向集合中第一个元素的迭代器。
删除元素:
  • ans.erase(n); //删除集合中指定元素。
  • ans.erase(ans.begin() + 1, ans.begin() + 4); // 删除第2项、第3项、第4项
统计元素数量
  • ans.count(n); // 返回某个值元素的个数。
  • ans.empty(); // 判断是否为空
  • ans.clear(); // 清空集合
  • ans.max_size(); // 返回集合能容纳元素的最大限值。
  • ans.size(); // 返回集合中元素的数目
其他:

ans.swap(b); // 交换集合ans和集合b中所有的元素

常用方法示例:

【C++】STL之容器:vector、set、map_第3张图片
【C++】STL之容器:vector、set、map_第4张图片

例题

映射map的使用

什么是map?

map是键值对,比如一个人名对应一个学号,键、值可以任何基本数据类型或者自定义数据类型;map中的元素会自动按照升序从大到小排序,map使用#include < map > 头文件。
map提供了" [ ] "运算符,使得map可以像数组一样使用。map也被称为关联数组。
map是key->value的映射。

如何使用map?

定义map:
  • map< string, int > ans; // 定义一个空的键值对ans,键(key)是string类型的,值(value)是int类型的。
插入元素:
  • ans[“skey”] = 100; 若映射中没有此键,则将此键值对存入映射中,若有,将键为“seky”的值设为100。
  • ans.insert(b.begin(), b.end()); // 将b中指定区域的元素插入到ans中。
  • ans.insert(pair(“coulsen”, 99)); //可以插入对应类型的键值对,返回一个指向插入元素的迭代器。如果键值对已经存在,则返回指向原来元素的迭代器。
    ans.insert({pair(“coulsen”, 99), pair(122, 144)}); 此处返回值为什么暂且不深究。
删除元素:
  • ans.erase(“skey”); //删除键是skey的元素。
  • ans.erase(ans.begin() + 2); // 删除第三个元素。
  • ans.erase(ans.begin() + 2, ans.begin() + 3); 删除第3个元素。
查找元素
  • 遍历:迭代器遍历,使用it->first获取键,it->second获取值。
 for(auto it = ans.begin(); it < ans.end(); it++){
   		cout<< it->first << " "<< ti->second;
}
  • ans.begin(); // 返回指向映射头部的迭代器。
  • ans.end(); //返回指向映射尾部后一个位置的迭代器
  • ans :: iterator t = ans.begin(); 或
    auto t = ans.begin();
    t = ans.find(“skey”); //如果找到,则返回一个指向元素所在位置的迭代器,否则返回指向映射尾部后一个位置的迭代器.( t == ans.end() );
    cout << t -> first << " " << t -> second; //输出时,可以使用迭代器输出,也可以使用数组方式输出.
    其他
    • ans.swap(b); //交换ans和b内所有元素.

例题

你可能感兴趣的:(代码,C++,STL)