C++小知识笔记(2)

1.函数模板语法:

template<typename T>

函数声明或定义

template——声明创建模板

typename——表明其后面的符号是一种数据类型,可以用class代替

T——通用的数据类型,名称可以替换,通常为大写字母

使用函数模板有两种方式:自动类型推导、显示指定类型

注意事项:使用模板时必须确定出通用数据类型T,并且能够推导出一致的类型

2.面向对象包括:封装、继承和多态。

3.STL——Standard Template Library,标准模板库

STL的六大组件:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

4.容器:vector 算法:for_each  迭代器:vector<int>::iterator

5.string中的assign

1) string str;

str.assign(hello world);    //把hello world赋值给str

2) string str;

str.assign(hello world,5);  //输出为hello前5个字符赋给str

  1. string str

str.assign(10,w);   //输出10个w字符

6.字符串string 拼接符号

1)  +=  

string str1 = ;

str1 += 爱玩游戏;

cout << "str1 = " << str1 << endl; //输出为: 我爱玩游戏

  1.  append

常规的拼接也可以做,下边2个是特别的记录

//把字符串前n个字符连接到当前字符串结尾

string str3 = I Love

str3.append("game abcdef", 4);

cout << "str3 = " << str3 << endl; //输出I Love game

//参数2 从哪个位置开始截取,参数3 截取字符个数

str2 =  DNF LOL ;

str3.append(str2, 4, 4);

cout << "str3 = " << str3 << endl;

//接着上边的输出:I Love game LOL

7.字符串string查找和替换

1)查找 find 和 rfind

    string str = "abcdefghijk";

int pos = str.find("de");

if (pos == -1)

{

cout << "未找到字符串" << endl;

}

else

{

cout << "找到字符串,pos = " << pos << endl;

}

输出为:找到字符串,pos = 3

2)替换repalce

string str1 = "abcdef";

//从1号位置起,替换3个字符,替换为“1111”

str1.replace(1, 3, "1111");

cout << "str1 = " << str1 << endl;

输出为:a1111ef

8.字符串string比较  replace

string str1 = "abcdef";

string str2 = "abcdef";

int com = str1.compare(str2);

if (com == 0)

{

cout << "两个字符串相等" << endl;

}

else if (com > 0 || com < 0)

{

cout << "两个字符串不相等" << endl;

}

9.字符串string存取——[]和at

//1. 通过[]访问单个字符

string str = "abcdef";

for (int i = 0; i < str.size(); i++)

{

cout << str[i] << " ";

}

cout << endl;

//2. 通过at方式访问单个字符

for (int i = 0; i < str.size(); i++)

{

cout << str.at(i) << " ";

}

cout << endl;

//3. 修改单个字符

str[0] = 'x';

// xbcdef

cout << "str = " << str << endl;

str.at(1) = 'Y';

//xYcdef

cout << "str = " << str << endl;

10.字符串string插入和删除

1)插入——insert

string str = "Hello";

//插入  输出结果:H520llo

str.insert(1, "520");

cout << "str = " << str << endl;

2)删除——erase

//删除  参数1 起始位置, 参数2 删除字符的个数

str.erase(1, 3);

cout << "str = " << str << endl;

11.字符串string子串——substr

string str = "Hello";

string Substr = str.substr(1, 3);

cout << "Substr = " << Substr << endl;

实际操作:

{

string email = "heima@qq.com";

int pos = email.find("@");

cout << "pos = " << pos << endl;

//输出邮箱@前的信息

string username = email.substr(0, pos);

cout << "username = " << username << endl;

}

12.vector

接口:

判断是否为空——empty()

返回元素个数——size()

返回容器容量——capacity()

重新指定大小——resize()

尾插——push_back()

尾删——pop_back()

插入——insert()  (位置迭代器)

删除——erase()   (位置迭代器)

清空——clear()

用迭代器获取vector容器中元素,v[]和v.at()也可以

v.front()返回容器第一个元素

v.back()返回容器最后一个元素

交换容器中的元素——swap()

利用swap可以收缩内存空间 vector<int>(v).swap(v);

排序——sort(v.begin(),v.end());  //默认升序

预留空间——reserve()

数据量比较大时,可以利用reserve来预留空间

13.deque容器

接口:

判断是否为空——empty()

返回元素个数——size()

重新指定大小——resize()

*deque没有容量这个概念

尾插——push_back()

头插——push_front()

尾删——pop_back()

头删——pop_front()

插入——insert()  (位置迭代器)

删除——erase()   (位置迭代器)

清空——clear()

排序——sort(d.begin(),d.end());

14.stack容器 栈

符合先进后出,栈没有遍历行为

返回栈顶——top

入栈——push

出栈——pop

判断栈是否为空——empty

返回栈大小——size

15.queue容器 队列

符合先进先出,只有队头和队尾才能被外界访问,因此没有遍历行为

入队列——push

出队列——pop

头队列——front

尾队列——back

判断队列是否为空——empty

返回队列大小——size

16.list容器 链表

接口:

判断是否为空——empty()

返回元素个数——size()

重新指定大小——resize()

尾插——push_back()

头插——push_front()

尾删——pop_back()

头删——pop_front()

插入——insert()  (位置迭代器)

删除——erase()   (位置迭代器)

移除——remove()

清空——clear()

list容器中不可以通过[]或者at()方式访问数据

返回第一个元素——front()

返回最后一个元素——back()

反转——reverse()

L.reverse();

所有不支持随机访问迭代器的容器,不可以用标准算法

不支持随机访问迭代器的容器,内部会提供对应一些算法

sort(L1.begin(),L1.end());  //这种表达就不可以了

可以使用:

升序排列  L.sort();  

降序排列  L.sort(myCompare);

bool  myCompare(int v1, int v2)

{

return v1 > v2;

}

17.set容器

插入数据——只有s.insert()这一种方式

特点:所有元素插入时候自动被排序,并且不允许插入重复值

接口:

判断是否为空——empty()

返回元素个数——size()

交换两个集合容器——swap()   // s1.swap(s2);

记住没有resize这个接口

插入——insert()  (位置迭代器)

删除——erase()   (位置迭代器)  也可以直接删除例如s.erase(30);

清空——clear()

查找——find() 例如:set<int>:: iterator pos = s1.find(30);

统计——count()  对于set容器而言,统计count不是0就是1

18.multiset容器

与set容器相比,multiset可以插入重复数据

19.map容器

自身按照key值默认排序

map中所有元素都是成对出现,插入数据时候要使用对组

接口:

判断是否为空——empty()

返回元素个数——size()

交换两个集合容器——swap()

插入——insert()  (位置迭代器)  记住一种就可以了

//第一种

m.insert(pair<int, int>(1, 10));

//第二种

m.insert(make_pair(2, 20));

删除——erase()   (位置迭代器)  

清空——clear()

查找——find() 例如:map<int,int>:: iterator pos = m.find(3);

统计——count()  对于map容器而言,统计count不是0就是1

20.算法

1)查找容器中,有没有大于5的数字

class GreaterFive

{

public:

bool operator()(int val)

{

return val > 5;

}

};

vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());

if (it == v.end())

{

 cout << "未找到" << endl;

}

else

{

 cout << "找到了大于5的数字为:" << *it << endl;

}

2)sort在vector容器中的降序排列

class Compare

{

public:

bool operator()(int val1, int val2)

{

return val1 > val2;

}

};

//可以使用greater<int>() 内建仿函数 头文件#include<functional>

//sort(v.begin(), v.end(), greater<int>());

sort(v.begin(), v.end(), Compare());

for (vector<int>::iterator it = v.begin(); it != v.end(); it++)

{

cout << *it << " ";

}

cout << endl;

21.算数仿函数 头文件添加 #include<functional>

取反——negate<T>  (一元运算)    // negate<int>n;   cout << n(10) << endl;  输出为:-10

加法——plus<T>   (一下都是二元运算)

减法——minus<T>

乘法——multiplies<T>

除法——divides<T>

取模——modulus<T>

22.关系仿函数    sort(v.begin(), v.end(), greater<int>()); 降序排列

大于 ——greater<T>()

大于等于——greater_equal<T>()

等于——equal_to<T>()

不等于——not_equal<T>()

小于——less<T>()

小于等于——less_equal<T>()

23.逻辑仿函数

逻辑与——logical_and<bool>()

逻辑或——logical_or<bool>()

逻辑非——logical_not<bool>()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值