2021-03-13

#STL的简单应用–知识点`
1
#include<bit/stdc++.h>//万能的头文件,对C++大部分操作完全可以实现。
C++中的输入和输出有两种方式,

#include<bit/stdc++.h>
using namespace std;
int main()
{
sync_with_stdio(false);

一种是scanf和printf,(scanf与printf使用的头文件应是stdio.h而不是 iostream)
一种是cin和cout(效率相对较低)
在#include<bits/stdc++.h>这个万能头文件下,这两种方式是可以互换的
sync_with_stdio(false);//加快cin与cout‘的运行速度。

2string
//头文件
优点:
string的用法与数组不同,定义一个字符串类型的数组,需要标注内存空间,例如
char name[20];//这个用在已知字符长度,而用string只需要
string name;创建一个空字符串对象,实现得到可变长度的字符序列。
例1

`#include<bit/stdc++.h>
using namespace std;
int main()
{
sync_with_stdio(false);//
string s1,s;
cin>>s;
cout<<s<<endl;
string s2="l have read books";
s1=s2;
cout<<s1<<endl;
cout<<s1.size()<<endl;} `

学习了string的一些简单的应用,
s.size()返回的是s中的字符个数
还有赋值,连接,比较。
getline()函数
一般表达为getline(cin,line)
line//第二个参数,存放读入字符串的string对象。
函数作用:就是把cin(从其正读取想要的内容,然后存入后一个参数里)

#include<bit/stdc++.h>
using namespace std;
int main ()
{
string s1;
while(getline(cin,s1));//就是在程序中输入字符串(包含空格)存入s1中
if(!line.empty())//string中bool返回值是否为空
cout<<s1<<s1.size()<<endl;
	return 0;
}

while
用循环读取未知数量的string对象,用下标运算符访问string中指定位置的字符时,范围是0-s1.size()

3(stack)
先进后出,操作最顶端元素,再返回bool与查找元素(字符)个数时候的操作差不多
(s.top())//返回栈顶元素
(s.pop();)移除
(s.push(a))压入一个元素
就是对栈顶的元素进行操作

`#include<bit/stdc++.h>
using namespace std;
int main()
{
sync_with_stdio(false);
stack<int>a;//这是进行定义

4队列(queue)–先入先出-普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除
类似于栈的定义,queue<int(类型)>q;

#include<bit/stdc++.h>
using namespace std;
int main()
{
sync_with_stdio(false);
queue<int>q;//定义一个queue函数q
q.push(11);
q.push(22);
q.push(33);//压入三个值,就是从已有元素后面增加元素。
cout<<q.front() <<endl; //front();返回队列的第一个元素的值,这里只是返回.
//与之对应的是q.back;返回队列的最后一个元素的值.
}

5vector动态数组
定义:vectorv
这个函数由push_back(类型 a)压入的时候是由最尾端插入。
同样也是删除最尾端pop_back()

6sort函数(#include<bit/stdc++.h>)
定义#include(头文件)
(1)int a[n]={ }//n是已知的数
sort(begin,end);
sort(a,a+n);//a是指针名地址从头到尾进行排序,默认从小到大。
(2)sort(begin,end,cmp);//反向排列
(3)bool cmp(int a,int b)
return a>b;
如果cmp返回结果为假, 那么函数就会将他们互换位置;
如果cmp返回结果为真,就会保持原来位置不变。在这里也就是如果a>b=ture,那么返回a>b,
else得到t=b,b=a,a=t;互换位置

7优先队列(priority_queue)为队列的一个延伸
定义:priority_queueq
优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除这是与普通队列的区别,

8去重unique
iterstor unique(name1 begin,name1 end);
iterstor unique(name1 begin,name1 end,MyFunc);
//最后一个参数是判断元素是否相等。
去除数组(容器)相邻重复出现的元素;注意,这里是相邻。但并没有删除,只是把元素放在末尾
使用条件:去重是相邻间的元素,在进行去重前先进行排序,例如
sort()
由于返回的是容器末尾,所以如果想得到去重后的size,需要减去初始地址。
9scanf
s= unique(b + 1,b + n + 1)-(b + 1);
scanf()函数是格式化输入函数
scanf(“格式化字符串”,地址);

10 operator()
函数对象:定义了调用操作符()的类对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般

11set和multiset
根据特定的准则排列元素。
不同:set不允许元素重复。
定义:sets;//默认从小到大。

#include<bit/stdc++.h>
using namespace std;
int main()
{
sync_with_stdio(false);
set<int>s1;
s1.inset(11);
s1.inset(11);
s1.inset(11);//插入返回新元素位置
s1.inset(22);
s1.inset(33);
cout<<s1.erase(n)<<s1.cout(elem);//n可以是元素也可以是地址。元素时返回删除个数,位置时,无返回值。+返回元素elem的个数。
//s1.clear() 移除全部元素。
}

12map和multimap
定义:map<lei1,lei2>map_name;
map<string,int>m;//默认由小到大排列。
与前面的差不多.但是map的每一个元素都有两个,第一个元素是键值,另一个是实值。
区别:map不可以已有两个相同的键值,但是另一个可以。
m.lower_bound();//
m.upper_bound();
upper_bound 和 lower_bound;
(1)upper_bound(begin, end, value);
返回>value的元素的第一个位置。
(2)lower_bound(begin, end, value);
返回>=value的元素的第一个位置。

#include<bits/stdc++.h>
using namespace std;

int main(){
    sync_with_stdio(false); 
    int a[10] = {1,3,5,2,4,6,7,5,2,5};
    sort(a, a + 10);、、a就是首地址,
    for (int i = 0; i < 10; ++i) cout<<a[i];
    int s, e;
    s = lower_bound(a, a + 10, 5);
    e = upper_bound(a, a + 10, 5);
    cout<<e-s<<endl;//大于5的第一个值
 
    return 0;
}

感悟
#贪心算法
寻找最优解的问题,从局部到整体,
给定一个载重量为M的背包,考虑n个物品,其中第i个物品的重量 ,价值wi (1≤i≤n),要求把物品装满背包,且使背包内的物品价值最大。
怎么贪?
本来我们要用一个包收起最有价值的东西,空间是一定的,我们会想
1多装物品,每次挑轻的物品;
3选价值大的物品;
但是总会不尽人意,因为每样东西的价值是不一样的。在这个题中引进了性价比这个概念。
按性价比从高到底的顺序选取物品;

上一篇:Android Stdio sqlite配置


下一篇:38