C++常用总结

1、提高cin与cout效率

cin与cout效率相比于scanf与printf低下

解决方案:

ios:sync_with_stdio(false);
cin.tie(0),cout.tie(0);

2、C++标准算法库algorithm

  1. max(a,b):求两个数最大值
  2. min(a,b):求两个数最小值
  3. abs(a,b):求一个整型变量的绝对值
  4. swap(a,b):交换a和b的值
  5. reverse(a,a+5):翻转a到a+5区间(前包后不包)的数组、容器的值(a为a[5]地址)
  6. reverse(v.begin(),v.end()):翻转容器,则需要用到begin()、end()函数(或迭代器)
  7. sort(a,a+5):对a到a+5区间的数组、容器进行排序默认升序排列(a为a[5]地址)
  8. sort(v.begin(),v.end()):排序容器,则需要用到begin()、end()函数(或迭代器)
  9. count(a, a+5, x):在数组中查找x在某区间出现的次数(a为a[5]地址)、
  10. count(v.begin(),v.end(),x):容器中查找,则需要用到begin()、end()函数(或迭代器)
  11. __gcd(a,b):求最大公因数(二者乘积除以最大公因数即可得到最小公倍数)
  12. next_permutation(a,a+3):将给定区间的数组、容器全排列(容器全排列:将参数换成iterator迭代器或begin()end()函数)
#include
#include
using namespace std;
int main() {  
	int a[3] = {1,2,3};
	do{
		cout<

补充:

3、#include中的fabs()函数还可用于求浮点型变量的绝对值

7、sort降序排序

bool cmp(int a, int b) {
	return a > b; 
}

int main() {
	int a[5] = {55,44,33,22,11};
	sort(a,a+5,cmp);//这里需要加上自己自定义的函数
	
 }

3、memset函数

void *memset(void *dest, int c, size_t count);
dest是目标内存块的指针,c是要设置的内容,count是要设置的字节数。
该函数会将dest指向的内存块的前count个字节都设置为c

4、vector(向量)

在容器中,向量可以看成类似一维的存储形式或者理解为长度可变的数组

优点:

  • 尾插尾删效率很高
  • 支持随机访问(利用下标访问)
  • 相比链表结构。顺序表CPU高速缓存命中率更高(因为顺序表的底层由数组实现,物理地址是连续的)

缺点:

  • 头部和中部插入删除效率低(O(N))
  • 扩容:存在性能消耗和空间上的浪费
    //元素个数
    int size = vectorname.size();         
 
    //判断是否为空
    bool isEmpty = vectorname.empty();    
 
    //从vec1.back位置插入5个值为3的元素
    vectorname.insert(vectorname.end(),5,3);    
    
    //删除末尾元素
    vectorname.pop_back();              
    
    //删除之间的元素,其他元素前移
    vectorname.erase(vec1.begin(),vec1.end());
 
    //判断是否相等==、!=、>=、<=...
    cout<<(vectorname==vectorname)?true:false;  
 
    //获取迭代器首地址
    vector::iterator iter = vectorname.begin();    
 
    //获取const类型迭代器
    vector::const_iterator c_iter = vectorname.begin();   
 
    //清空元素
    vectorname.clear();                 

5、list(列表)

列表是用双向链表实现的,所谓的双向链表,指的是既可以从链表的头部开始搜索找到链表的尾部,也可以进行反向搜索,从尾部到头部

优点:

  • 任意位置插入删除效率很高。(O(1))
  • 按需申请和释放,优化了vector在空间上的浪费

缺点:

  • CPU高速缓存的命中率不高(物理地址空间不连续)
  • 不支持随机访问
构造空的list
list()	

构造的list中包含n个值为val的元素
list (n, val)	

拷贝构造函数
list (list& x)	

用[first, last)区间中的元素构造list
list (first, last)	

头插一个数据
push_front

头删一个数据
pop_front

尾插一个数据
push_back

尾删一个数据
pop_back

获取当前容器当中的元素个数
size

判断当前容器是否为空
empty

清空容器,清空后容器的size为0, 但是头结点(哨兵位)不会被清除
clear

容器当中的数据默认排为升序
sort

删除容器当中特定值的元素, 找到了就删(所有的都删除),没就不删
remove

删除容器当中连续的重复元素进行去重
unique

交换两个容器的内容
swap

得到容器中第一个元素的正向迭代器
begin

得到容器中最后一个元素的后一个位置的正向迭代器
end

得到容器中最后一个元素的后一个位置的反向迭代器
rbegin

得到容器中第一个元素的反向迭代器
rend

获取list容器当中的第一个元素
front

获取list容器当中的最后一个元素
back


list当中的insert函数支持三种插入方式:

  1. 在指定迭代器位置插入一个数,
  2. 在指定迭代器位置插入n个值为val的数,
  3. 在指定迭代器位置插入一段迭代器区间(左闭右开)
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	list lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);

	list::iterator pos = find(lt.begin(), lt.end(), 2);
	lt.insert(pos, 9); //在2的位置插入9
	
	pos = find(lt.begin(), lt.end(), 3);
	lt.insert(pos, 2, 8); //在3的位置插入2个8
	
	vector v(2, 7);
	pos = find(lt.begin(), lt.end(), 1);
	lt.insert(pos, v.begin(), v.end()); //在1的位置插入2个7
	
}

erase

list当中的erase函数支持两种删除方式:

  1. 删除指定迭代器位置的元素,
  2. 删除指定迭代器区间(左闭右开)的所有元素,
#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	list lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);
	list::iterator pos = find(lt.begin(), lt.end(), 2);
	lt.erase(pos); //删除2

	pos = find(lt.begin(), lt.end(), 4);
	lt.erase(pos, lt.end()); //删除4及其之后的元素
	
	return 0;
}

6、deque(双端队列)

一种双开口的“连续”空间的数据结构,从前后两端都可以进行数据的插入和删除操作,同时支持数据的快速随机访问

7、string(字符串)

与vector相似的容器。专门用于保存字符。随机访问快。尾部插入删除快

8、map(映射)

你可能感兴趣的:(数据结构与算法,c++,开发语言)