标签:cin main 检索 大小 ace 空格 直接 key 间接
int a;
scanf("%d\n", a);
printf("%d", a);
int a,b,c;
cin>>a>>b>>c;
cout<<a<<b<<c<<endl;
迭代器————理解为指针,但是迭代器分为4种:
1) 正向迭代器,定义方法如下:
容器类名::iterator 迭代器名;
2) 常量正向迭代器,定义方法如下:
容器类名::const_iterator 迭代器名;
3) 反向迭代器,定义方法如下:
容器类名::reverse_iterator 迭代器名;
4) 常量反向迭代器,定义方法如下:
容器类名::const_reverse_iterator 迭代器名;
表1:不同容器的迭代器的功能
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set | 双向 |
map | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |
sort()函数语法描述:sort(begin,end,cmp),cmp参数可以没有,如果没有默认非降序排序。
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[] = {1,5,4,8,10,6,3};
sort(a,a+7);
//sort(a,a+7,less<int>());
//sort(a,a+7,graeter<int>());
for(int i = 0; i < 7; i++){
cout<<a[i]<<" ";
}
return 0;
}
运行结果:1 3 4 5 6 8 10
1.使用迭代器可以完成顺序排序:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main(){
string str = "hello world";
sort(str.begin(),str.end(),less<int>());
string :: iterator it;
for(it=str.begin();it!=str.end();it++){
cout<<*it;
}
cout<<endl;
cout<<str<<endl;
return 0;
}
运行结果:空格dehllloorw
2.使用反向迭代器可以完成逆向排序
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string str("hello world");
sort(str.rbegin(),str.rend());
//sort(str.begin(),str.end(),greater<int>());
cout<<str;
return 0;
}
运行结果:wroolllhde空格
3.以结构体为例的二级排序
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct link{
int a,b;
};
bool cmp(link x,link y){
if(x.a == y.a){
return x.b > y.b;
}
return x.a > y.a;
}
int main(){
link x[4];
for (int i=0;i<4;i++){
cin>>x[i].a>>x[i].b;
}
sort(x,x+4,cmp);
for (int i=0;i<4;i++){
cout<<x[i].a<<" "<<x[i].b<<endl;
}
cout<<endl;
return 0;
}
概念:相当于char * 封装,理解为字符串
int main(){
//C中定义字符串以及打印
char *ch="sdasfsfjg";
for(int i = 0;ch[i] !='\0';i++){
cout<<*(ch + i);
}
cout<<endl;
//C++
string s = "sadasdsfg";
cout<<s<<endl;
return 0;
}
我想获取一行字符串
hello world
C中:
#include<stdio.h>
int main(){
char ch[100];
/*
scanf()不能获取含有空格的字符串,遇到空格就会停止,只能获取一个单词
*/
gets(ch);//获取一行有空格的字符串
for(int i = 0; ch[i] != '\0'; i++){
printf("%s",ch[i]);
}
return 0;
}
C++中:
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
getline(cin,s);
cout<<s;
return 0;
}
+=对于字符串,字符有效,数字会转为ascii码 ‘+’是连接符
#include<iostream>
#include<string>
using namespace std;
int main(){
string s;
s +="hello";
s +=" world";
s += '5';
s += 10;//10对应的ascii码是换行
int a=5;
s +=(a+'0');//s后加入5
cout<<s;
return 0;
}
功能:默认进行升序排序
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s = "2314546754";
sort(s.begin(),s.end());
cout<<s;
return 0;
}
功能:删除string的一个字符
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s = "2314546754";
sort(s.begin(),s.end());
cout<<s;
return 0;
}
功能:抽取一个子字符串
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s = "2314546754";
s = s.substr(1,3);//取314,取索引为1,往后截取3个
cout<<s<<endl;//s="314"
s = s.substr(0,-1);//取314,取索引为0,即第一个开始,-1截到最后
cout<<s;
return 0;
}
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s = "123456";
cout<<s.size()<<" "<<s.length()<<endl;
//for循环
for(int i=0; i<s.size(); i++){
cout<<s[i];
}
cout<<endl;
//迭代器
for(string :: iterator it = s.begin(); it != s.end(); it++){
cout<<*it;
}
cout<<endl;
//迭代器简化
for(auto it = s.begin(); it != s.end(); it++){
cout<<*it;
}
cout<<endl;
//利用C++11新特性for循环
for(auto x:s){
cout<<x;
}
cout<<endl;
cout<<s;
return 0;
}
概念:vector相当于数组,模板类型相当于存放的内容
方式1:
//定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定
vector<int>a(10);
方式2:
//定义具有10个整型元素的向量,且给出的每个元素初值为1
vector<int>a(10,1);
方式3:
//用向量b给向量a赋值,a的值完全等价于b的值
vector<int>a(b);
方式4:
//将向量b中从0-2(共三个)的元素赋值给a,a的类型为int型
vector<int>a(b.begin(),b.begin+3);
方式5:
//从数组中获得初值
int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);
实例
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v1;//定义一个空的vector
vector<int> v2(4);//定义一个4个大小的vector,初始为0
vector<int> v3(4,6);//定义一个4个大小vector,初始为6
vector<int> v4{1,2,3,4};//c++11新特性,定义一个vector,数字为1,2,3,4
vector<int> :: iterator it;
for(it = v2.begin();it != v2.end(); it++){
cout<<*it<<' ';
}
cout<<endl;
for(auto x:v2) cout<<x<<' ';
cout<<endl;
for(auto x:v3) cout<<x<<' ';
cout<<endl;
for(auto x:v4) cout<<x<<' ';
cout<<endl;
return 0;
}
运行结果:
0 0 0 0
0 0 0 0
6 6 6 6
1 2 3 4
vector<int> v{1,2,3,4};
cout<<v[1]<<endl;//索引为1,v[1]=2;
cout<<v.at(1)<<endl;//索引为1,v.at(1)=2;
vector<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(3);
v.push_back(2);
v.push_back(1);
for(auto x:v){
cout<<x<<' ';
}
运行结果:
5 4 3 2 1
vector<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(3);
v.push_back(2);
v.push_back(1);
for(auto x:v){
cout<<x<<' ';
}
v.resize(10);//重新更改v的大小,对于多出的部分补0,对于少出的不分直接截取部分
for(auto x:v){
cout<<x<<' ';
}//5 4 3 2 1 0 0 0 0 0
v.resize(3);
for(auto x:v){
cout<<x<<' ';
}//5 4 3
运行结果:
5 4 3 2 1 0 0 0 0 0
5 4 3
vector<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(3);
v.push_back(2);
v.push_back(1);
v.erase(v.begin());//删除第一个元素
v.erase(--v.end());//删除最后一个元素
for(auto x:v){
cout<<x<<' ';
}
运行结果:
4 3 2
//获取第一个元素
cout<<v.front();
cout<<v[0];
cout<<*v.begin();
//获取最后一个元素
cout<<v.back();
cout<<v[v.size()-1];//size()是获取大小
cout<<*--v.end();
第三个参数为比较器,不写默认为less
int main(){
vector<int> v;
v.push_back(5);
v.push_back(3);
v.push_back(1);
v.push_back(4);
v.push_back(2);
sort(v.begin(),v.end(),less<int>());//从小到大
for(auto x:v){
cout<<x<<' ';
}
cout<<endl;
sort(v.begin(),v.end(),greater<int>());//从大到小
for(auto x:v){
cout<<x<<' ';
}
return 0;
}
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> v;
v.push_back(5);//在v的尾部加入5
v.push_back(3);//在v的尾部加入3
v.push_back(1);
v.push_back(4);
v.push_back(2);
for(int i = 0;i < v.size();i++){
cout<<v[i]<<' ';//vector支持随机访问
}
cout<<endl;
vector<int>::iterator it;
for(it = v.begin();it != v.end();it++){
cout<<*it<<' ';
}
cout<<endl;
for(auto it=v.begin();it != v.end();it++){
cout<<*it<<' ';
}
cout<<endl;
for(auto x:v){
cout<<x<<' ';
}
return 0;
}
概念:栈,栈是一种后进先出的元素序列,访问和删除都只能对栈顶的元素(即最后一个被加入栈的元素)进行,并且元素也只能被添加到栈顶。栈内的元素不能访问。如果一定要访问栈内的元素,只能将其上方的元素全部从栈中删除,使之变成栈顶元素才可以。
先进后出,栈顶进,栈顶出,pop()从栈顶出一个元素,但是不返回元素。
stack<int> s;
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<int> s;
s.push(3);
s.push(2);
s.push(1);
cout<<s.top()<<endl;
s.pop();
cout<<s.top()<<endl;
s.pop();
cout<<s.top()<<endl;
s.pop();
cout<<s.size()<<endl;
cout<<s.empty();//s空,返回1;s不空,返回0
return 0;
}
int itob(int dec){
stack<int> s;
int res = 0;
while(dec != 0){
s.push(dec%2);
dec /= 2;
}
while(!s.empty()){
res = res*10+s.top();
s.pop();
}
return res;
}
#include <sstream>
#include <stack>
using namespace std;
int main(){
stringstream ss;
string line;
stack<string> s;
getline(cin,line);
ss<<line;//<<箭头流向哪里,输如到哪里
while(ss>>line){
s.push(line);
}
while(!s.empty()){
cout<<s.top();
s.pop();
if(s.size() != 0) cout<<' ';//s.size()==0与s.empty()效果一样
}
return 0;
}
#include <iostream>
#include <sstream>
using namespace std;
int main(){
//数字转字符串
//方法一:
int a = 1234;
string out;
stringstream ss;
ss<<a;
ss>>out;
cout<<out<<endl;
//方法二:(c++11)
int b = 12345;
cout<<to_string(b)<<endl;
return 0;
}
#include <iostream>
#include <sstream>
using namespace std;
int main(){
//字符串转数字
//方法一:
string s="1234";
int i;
stringstream ss;
ss<<s;
ss>>i;
cout<<i<<endl;
//方法二:(c++11)
string str = "12345";
i = stoi(str);
cout<<i<<endl;
return 0;
}
概念:queue 就是“队列”。队列是先进先出的,和排队类似。队头的访问和删除操作只能在队头进行,添加操作只能在队尾进行。不能访问队列中间的元素。
swap(queue
构造与常用方法
#include <iostream>
#include <queue>
using namespace std;
int main(){
queue<int> q;
q.push(5);//在队列头加入5
q.push(6);//在队列头加入6
cout<<q.front()<<endl;//访问队列头的第一个元素
q.pop();//弹出队列头的第一个元素
cout<<q.front()<<endl;//访问队列头的第一个元素
q.pop();
cout<<q.size();//size()显示队列的大小
return 0;
}
概念:映射(map为树状表,unodered_map为哈希表)
#include <iostream>
#include <map>
using namespace std;
int main(){
map<int,int> m;//键值有序的,树状结构(底层)
m[6] = 3;//在map中使用下标访问不存在的元素将导致在map容器中添加一个新的元素
m.insert(make_pair(3,2));
m[7] = 9;
for(auto it = m.begin(); it != m.end(); it++){
cout<<it->first<<' '<<it->second<<endl;
}
for(auto x:m) cout<<x.first<<' '<<x.second<<endl;
return 0;
}
运行结果:(结果显示键值有序,默认按升序排序)
3 2
6 3
7 9
3 2
6 3
7 9
#include <iostream>
#include <unordered_map>
using namespace std;
int main(){
unordered_map<int,int> m;//键值无序的,哈希结构(底层)
m[6] = 3;
m[3] = 2;
m[7] = 9;
for(auto it = m.begin(); it != m.end(); it++){
cout<<it->first<<' '<<it->second<<endl;
}
for(auto x:m) cout<<x.first<<' '<<x.second<<endl;
return 0;
}
运行结果:(结果显示键值无序)
7 9
3 2
6 3
7 9
3 2
6 3
pair<int ,double> p1;//默认构造函数
pair<int ,double> p2(1, 2.4);//用给定值初始化
pair<int ,double> p3(p2);//拷贝构造函数
vec.push_back(make_pair(20,30));
vec.push_back(make_pair<int,int>(10,50));
//声明vector:
vector<pair<int,int>>vec
//往vector中插入数据,需要用到make_pair:
vec.push_back(make_pair(20,30));
vec.push_back(make_pair<int,int>(10,50));
#include <iostream>
#include <unordered_map>
#include <algorithm>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b){
return a.first > b.first;
}
int main(){
unordered_map<int,int> m;//键值无序的,哈希结构(底层)
m[6] = 3;
m[3] = 2;
m[7] = 9;
vector <pair<int,int>> v(m.begin(),m.end());
sort(v.begin(),v.end());
for(auto it = m.begin(); it != m.end(); it++){
cout<<it->first<<' '<<it->second<<endl;
}
for(auto x:m) cout<<x.first<<' '<<x.second<<endl;
return 0;
}
概念:集合是一种包含已排序对象的关联容器。set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。
不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素
不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;
return 0;
}
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
set<int>::iterator it; //定义前向迭代器
//中序遍历集合中的所有元素
for(it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
//运行结果:1 3 5 6
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> s;
s.insert(5); //第一次插入5,可以插入
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5); //第二次插入5,重复元素,不会插入
set<int>::reverse_iterator rit; //定义反向迭代器
//反向遍历集合中的所有元素
for(rit = s.rbegin(); rit != s.rend(); rit++)
{
cout << *rit << " ";
}
cout << endl;
return 0;
}
//运行结果:6 5 3 1
元素的删除
与插入元素的处理一样,集合具有高效的删除处理功能,并自动重新调整内部的红黑树的平衡。
删除的对象可以是某个迭代器位置上的元素、等于某键值的元素、一个区间上的元素和清空集合。
erase(iterator),删除定位器iterator指向的值
erase(first,second),删除定位器first和second之间的值
erase(key_value),删除键值key_value的值
元素的检索
使用find()方法对集合进行检索,如果找到查找的的键值,则返回该键值的迭代器位置;否则,返回集合最后一个元素后面的一个位置,即end()。
find()--返回一个指向被查找到元素的迭代器
count()--返回某个值元素的个数
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int main(){
set<int> s;
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5);
set<int> :: iterator it;
it = s.find(6);
if(it != s.end())
cout<<*it<<endl;
else
cout<<"not find it"<<endl;
it = s.find(20);
if(it != s.end())
cout << *it << endl;
else
cout << "not find it" << endl;
if(s.count(6)!= 0)
cout<<"在集合中"<<endl;
return 0;
}
运行结果:
6
not find it
在集合中
#include <iostream>
#include <set>
#include <unordered_set>
using namespace std;
int main(){
set<int> s;//树状结构,有序
unordered_set<int> s1;//哈希结构,无序,快
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5);
s.insert(5);
s.insert(5);
s.insert(5);
cout<<s.size()<<endl;
for(auto x:s)
cout<<x<<" ";
cout<<endl;
set<int> :: iterator it;
for(it = s.begin();it != s.end();it++)
cout<<*it<<" ";
return 0;
}
概念:双端队列是一种具有队列和栈的性质的数据结构。双端队列的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
//a) 构造函数
deque<int> ideq
//b)增加函数
ideq.push_front(x):双端队列头部增加一个元素X
ideq.push_back(x):双端队列尾部增加一个元素x
//c)删除函数
ideq.pop_front():删除双端队列中最前一个元素
ideq.pop_back():删除双端队列中最后一个元素
ideq.clear():清空双端队列中元素
//d)判断函数
ideq.empty() :向量是否为空,若true,则向量中无元素
//e)大小函数
ideq.size():返回向量中元素的个数
概念:双端链表,不能使用下标运算符 [] 访问其中的元素,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。
list<int>lst1; //创建空list
list<int>lst2(5); //创建含有5个元素的list
list<int>lst3(3,2); //创建含有3个元素的list,初始为2
list<int>lst4(lst2); //使用lst2初始化lst4
list<int>lst5(lst2.begin(),lst2.end()); //同lst4
Lst1.assign() 给list赋值
Lst1.back() 返回最后一个元素
Lst1.begin() 返回指向第一个元素的迭代器
Lst1.clear() 删除所有元素
Lst1.empty() 如果list是空的则返回true
Lst1.end() 返回末尾的迭代器
Lst1.erase() 删除一个元素
Lst1.front() 返回第一个元素
Lst1.get_allocator() 返回list的配置器
Lst1.insert() 插入一个元素到list中
Lst1.max_size() 返回list能容纳的最大元素数量
Lst1.merge() 合并两个list
Lst1.pop_back() 删除最后一个元素
Lst1.pop_front() 删除第一个元素
Lst1.push_back() 在list的末尾添加一个元素
Lst1.push_front() 在list的头部添加一个元素
Lst1.rbegin() 返回指向第一个元素的逆向迭代器
Lst1.remove() 从list删除元素
Lst1.remove_if() 按指定条件删除元素
Lst1.rend() 指向list末尾的逆向迭代器
Lst1.resize() 改变list的大小
Lst1.reverse() 把list的元素倒转
Lst1.size() 返回list中的元素个数
Lst1.sort() 给list排序
Lst1.splice() 合并两个list
Lst1.swap() 交换两个list
Lst1.unique() 删除list中重复的元素
实例:sort()
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main(){
list<int> li;
li.push_back(6);
li.push_front(5);
li.emplace_front(9);
li.emplace_back(10);
li.insert(li.begin()++,2);
for(auto tmp:li) cout<<tmp<<" ";
cout<<endl;
li.sort();
for(auto it=li.begin();it!=li.end();it++) cout<<*it<<" ";
return 0;
}
运行结果:
2 9 5 6 10
2 5 6 9 10
标签:cin main 检索 大小 ace 空格 直接 key 间接
原文地址:https://www.cnblogs.com/blink-cz/p/12230923.html