算法比赛C++STL常用操作

C++STL常用操作

  • vector(1,封装数组,能重)
    • 定义:
    • 添加
    • 取出
    • 大小
    • 排序
    • 翻转
    • 遍历
    • 删除
    • 交换
    • 查找
  • int []
    • 长度
    • 排序
  • map(2,二叉树,不能重)
    • 定义
    • 添加
    • 大小
    • 取出
    • 修改
    • 排序
    • 翻转
    • 遍历
    • 删除
    • 交换
  • set(1,二叉树,不能重)
    • 定义
    • 添加
    • 大小
    • 取出
    • 排序
    • 翻转
    • 遍历
    • 删除
    • 查找

vector(1,封装数组,能重)

定义:

一般定义:

​ vector 定义一个存放int的vector0

​ vector >定义一个两个东西的vector

使用数组定义:

​ int i[10] ={1,2,3,4,5,6,7,8} ;
​ vector v(i+1,i+3); //从第2个元素到第3个元素

有大小定义:

​ vector a(10);

初始值定义:

​ vector a(10, 2); //初始值都是2

添加

vector向后插入:

​ v.insert(v.end(), “aefgts”);

​ v.insert(v.end(), make_pair(“ssdf”, 2));

​ v.push_back(123);

​ v.push_back({}); //插入空

​ v.push_back({1}); //插入1

插入另一个vector:

​ v.insert(old.end(), new.begin(), new.end());

插入n个:

​ v.insert(pos,n,elem)

vector >添加:

​ v.push_back({1, 2, 3}); //插入vector

错误写法:

​ v.push_back();

​ v.push_back([]);

取出

取出第一个:

​ v.front()

​ *v.begin()

取出最后一个:

​ v.back()

​ *(v.end() - 1)

取出第i个:

​ v[i]

大小

计算大小:

​ v.size()

错误写法:

​ v.size

​ v.length

​ v.length()

排序

排序:

​ sort(v.begin() , v.end()); //从小到大

自定义排序:

​ sort(v.begin() , v.end(), cmp); //从小到大

​ bool cmp(const int& a, const int& b) {

​ return a > b;

​ }

翻转

翻转:

​ reverse(vi.begin(),vi.end()); // 从大到小

遍历

循环:

​ for (int i = 0; i < len; i++) {}

​ for(vector::iterator it = v.begin() ;it !=v.end(); ++it){*it}

反向循环:

​ for(vector::iterator it = v.rbegin(); it != v.end(); ++it){*it}

删除

清空:

​ v.clear();

删除第一个:

​ v.erase(v.begin());

删除最后一个:

​ v.pop_back()

删除:

​ v.erase(pos,n); //删除从pos开始的n个,不是从pos到n

交换

交换:

​ v1.swap(v2);

​ swap(v1, v2);

查找

查找:

​ vector::iterator iter = find(v.begin(), v.end(), value);

​ int index = iter - v.begin();

判断是否查找到:

​ vector::iterator iter = find(v.begin(), v.end(), value);

​ if(iter != v.end()) {}

int []

长度

没法求

排序

排序:

​ sort(a, a + 5); //从小到大

​ sort(a, a + 5, cmp);

​ bool cmp(const int& a, const int& b) {

​ return a > b;

​ }

map(2,二叉树,不能重)

自动排序,按从小到大字典序

有key和value ,每个关键字在map中出现一次

定义

直接定义:

​ map m;

​ map m; 添加m[“ss”] = &c; c是数组;获取:*(n.find(“ss”)->second)[0]

根据其他的map定义:

​ map n(m);

添加

可覆盖添加:

​ m[‘a’] = 2;

不可覆盖添加(不报错,添不进去):

​ m.insert(pair(111, “kk”));

​ m.insert(map::value_type(222, “pp”));

添加另一个map:

​ n.insert(m.begin(), m.end());

大小

大小:

​ m.size()

取出

已知key,取出key:

​ m.find(“333”)->first

已知key,取出value:

​ m.find(“333”)->second

​ m[“333”]; //要是没有就加上了

已知value,取出key:

​ for (std::map::iterator it = m.begin(); it != m.end(); it++) {

​ if (it->second == value) {}

​ }

修改

一直key,value自增

​ ++(m.find(1)->second);

排序

按key排序:

​ struct Cmp{
​ bool operator()(const string& k1, const string& k2)const {
​ return k1.length() < k2.length();
​ }
​ };

​ map m;

key和value都排序:pair转化为vector再用sort

#include  
#include 
#include 
#include  
#include 
#include 
#include 

using namespace std;

bool cmp(const pair &a, const  pair &b) {
	return a.first > to_string(b.second);
}
int main() {
	map nm;
	nm.insert(pair("123", 2));
	for (int i = 0; i < 5; i++) {
		nm.insert(pair(to_string(i) + "!!!", 3 + i));
	}

	for (map::iterator it = nm.begin(); it != nm.end(); ++it) {
		cout << it->first << "   " << it->second << endl;
	}
	cout << endl;

	vector > v(nm.begin(), nm.end());
	std::sort(v.begin(), v.end(), cmp);

	for (int i = 0; i < (int)v.size(); i++) {
		cout << v[i].first << "  " << v[i].second << endl;
	}
	return 0;
}

翻转

遍历

for (map::iterator it = m.begin(); it != m.end(); ++it) {
cout << it -> first << it -> second << endl;
}

删除

m.erase(“234”); //如果没有就跳过

m.erase(m.find(“234”)); //如果没有就会死循环

m.erase(m.begin(), m.end());

交换

set(1,二叉树,不能重)

自动排序,按从小到大字典序

定义

定义:

​ set s

添加

添加:

​ s.insert(2); //不需要指定位置

​ 没有push_back

大小

​ s.size();

取出

取出第一个:

​ *v.begin()

取出最后一个:

​ *(–s.end())

排序

翻转

遍历

for (set::iterator it = s.begin(); it != s.end(); ++it) {
cout << *it << endl;
}

删除

删除元素:

​ s.erase(value);

​ s.erase(s.begin());

删除两个之间的:

​ s.erase(s.begin(), s.end())

​ s.erase(s.begin(), --s.end()) //留最后一个

删除某一个:

​ set::iterator it = s.begin();
​ for (int i = 0; i < 2; i++) {
​ it++;
​ }
​ s.erase(it);

查找

​ if (s.find(2) != s.end()){true}

​ if (s.count(3)) {true}

你可能感兴趣的:(算法,极致通俗)