PAT基础知识点
Dev C++支持C++11语法新特性:
Tool-> Compiler Option-> Add: -std=c++11
#include <string>
http://blog.csdn.net/fenxinzi557/article/details/51457829
string赋值 string str = “content”; equals string str (“content”);
string尾部添加 string.append(“”); .append(a,index0,string::npos);//把字符串a的首字母到尾字母加上
string中间插入 sting.insert(index,”content”);
注:单个字符串(比如数字)的插入
string str;
int num = 7;
str+=(char)(num%7+'0')
string删除 string.erase(index,//number);
string替换 string.replace(index,number,”content”);
string字符个数 string.size() equals string.length(); //常用于循环
for(int 1=0; i<string.size(); i++){}
string的比较 string.compare(//index,//number,“content”,//index,//number);
string的判空 string.empty();
string的提取
string[index] equals string.at(index); 单个提取
string.substr(); 返回全部内容
string.substr(index,//number);
string的复制 string str2 (str1);
string的分割 string.substr(index,number) ;
string的查找 string.find(“contex”,//index,//number);
//从index开始找
//有,返回index,它的类型是string::size_type; 没有,返回string::npos;
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
//查找子串出现的所有位置
string substr = "i";
position = 0;
int i = 1;
while((position = str.find_first_of(substr,position)) != string::npos)
{
cout<<"position "<<i++<<position<<endl;
position++;
}
字符串反转
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s = "hello";
reverse(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
string的转换(**1002)**
http://greatverve.cnblogs.com/archive/2012/10/24/cpp-int-string.html
-
int,float,double等转换为string
-
string = to_string(number)
-
string转换为int,float
-
首先要包含头文件#include <algorithm>
-
调用函数 atoi(string.c_str()); atof(string.c_str())
int转string
int a,b;
cin>>a>>b;
int c;
c = a+b;
char Cchar[10];
string Cstring = itoa(c,Cchar,10);
string转int
std::string str = "123";
int n = atoi(str.c_str());
OR
int result = stoi(a) - stoi(b);
string的分割 1009
C/C++中符号的分割是很困难的,如果不能使用如下方法,那么只能组合使用string.find();和string.substr();的方法了。如下方法在PAT考试中很实用:
string串的输入 1042
string串(e.g: I love u)的输入主要要解决两个问题,string串的大小未定,不能用一个string解决(因为含有一个“ ”作为分割)
-
因为输入时就是以空格为分割,所以可以边输入边存储在vector中,但是要注意去cin.get();吸收空格,回车。当然遵循下面代码的原则就可以啦。
vector<string> ans;
while(1){
string str;
cin >> str;
ans.push_back(str);//把每个单词都加入字符串数组
char c = cin.get(); //用一个字符c来吸收空格
//作用同getchar();
if (c == ' '){
break;
}
}
Tips:
-
npos的含义: string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较
-
如:if(s.find(“jia”)== string::npos)
此时string::size_type position; 而不是 int position;
-
string[N]是一个char类型
C/C++中string、char *、char[]的转换
https://www.cnblogs.com/Pillar/p/4206452.html
#include <cmath>
http://blog.csdn.net/mary19920410/article/details/63696380
int abs 绝对值,返回整型int
double fabs 绝对值.,返回double
double pow(double x, double y); 返回x^y 1012
double log(double x); 返回logeX
double log10(double x); 返回lgX;
int ceil(double x) 向上取整
int floor(double y) 向下取整
Notes:
使用时,直接使用函数即可。例如:计算一个数得平方根
sqrt(int a) 而不是int a=4; a=a.sqrt();
#include<algorithm>
http://blog.csdn.net/qq_28479381/article/details/53994972
http://blog.csdn.net/RRicky_/article/details/76696422
sort()函数最为常用,但要注意:
-
sort(buffer,buffer+n,//less<data-type>()||greater<data-type>()); buffer为待排序数组的首地址,buffer+n为待排序数组的最后一个数据的地址。
-
less<int>(); 升序
greater<int>(); 降序
reverse(myvector.begin(),myvector.end()); 翻转一个vector 两个参数,一个首地址,一个尾地址;string的操作类似。
#include<vector>
http://blog.csdn.net/duan19920101/article/details/50617190/
建立vector
#include <vector>
vector<data-type> name;
使用迭代器访问元素
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
向vector添加元素
尾插:name.push_back(element); 这样name[0]=element;
任意插:name.insert(vec.begin()+i,a); 在i个元素前面插入a;
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v(3);
v[0]=2; //v[0]是第0个元素
v[1]=7;
v[2]=9;
v.insert(v.begin(),8);//在最前面插入新元素。
v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素
v.insert(v.end(),3);//在向量末尾追加新元素。
v.insert(v.end(),4,1);//在尾部插入4个1
int a[] = {1,2,3,4};
v.insert(v.end(),a[1],a[3]);//在尾部插入a[1]个a[3]
vector<int>::iterator it;
for(it=v.begin(); it!=v.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
//8 2 1 7 9 3 1 1 1 1 4 4
//请按任意键继续. . .
删除vector内元素
name.erase(name.begin()+i); 删除第i+1个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
vector大小 name.size();
vector初始化
//初始化size,但每个元素值为默认值
vector<int> abc(10); //初始化了10个默认值为0的元素
//初始化size,并且设置初始值
vector<int> cde(10,1); //初始化了10个值为1的元素
vector查询
#include <algorithm>
if(find(vector.begin(), vector.end(), val) != vector.end()){
//找到
}else{
//没找到
}
vector的排序
#include <algorithm>
sort(vector.begin(),vector.end());
(默认是按升序排列,即从小到大).
可以通过重写排序比较函数按照降序比较,如下:
定义排序比较函数:
bool Comp(const int &a,const int &b)
{
return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。
vector的翻转 #include <algorithm> reverse(vec.begin(),vec.end());
vector二维数组 vector< vector<type> > name //注意<<不能连写,得有空格
vector二维数组的赋值
vector<vector<string> > v;
for(int i = 0; i < 3; i++) {
string s;
getline(cin, s);
vector<string> row;
int j = 0, k = 0;
while(j < s.length()) {
if(s[j] == '[') {
while(k++ < s.length()) {
if(s[k] == ']') {
row.push_back(s.substr(j+1, k-j-1));
break;
}
}
}
j++;
}
v.push_back(row);
}
Tips:
vector相当于一个size可变的数组。相比于数组,vector会消耗更多的内存以有效的动态增长。vector能更快的索引元素,而且能相对高效的在尾部插入和删除元素。
常和#include<algorithm>同用
reverse(name.begin(),name.end()); 逆序排列
sort(name.begin(),name.end()) ; 升序排列
特别注意:
-
如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;
#include <cctype>
http://blog.csdn.net/bat67/article/details/52021803
int tolower(char) 若char是大写字母('A'-'Z')返回相应的小写字母('a'-'z')的ASCII码
int toupper(char) 若char是小写字母('a'-'z')返回相应的大写字母('A'-'Z')的ASCII码
int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0
int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0
int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0
int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0
int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9') 返回非0值,否则返回0
sample:
#include<ctype.h>
#include<stdio.h>
int main()
{
char str[]="I love ShangHai";
//将字符串中的小写字母转化为大写字母
int i=0;
char c;
while (str[i])
{
c=str[i];
if (islower(c)) str[i]=toupper(c);
i++;
}
printf("%s ",str);
}
1033
#include <iostream>
#include <cctype>
using namespace std;
int main() {
string bad, should;
getline(cin, bad); //为了防止第一行是空的,不能用cin >> ,用getline(cin, ...)
getline(cin, should);
for (int i = 0, length = should.length(); i < length; i++) {
if (bad.find(toupper(should[i])) != string::npos) continue;
if (isupper(should[i]) && bad.find('+') != string::npos) continue;
cout << should[i];
}
return 0;
}
1014
#include <iostream>
#include <cctype>
using namespace std;
int main() {
string a, b, c, d;
cin >> a >> b >> c >> d;
char t[2];
int pos, i = 0, j = 0;
while(i < a.length() && i < b.length()) {
if (a[i] == b[i] && (a[i] >= 'A' && a[i] <= 'G')) {
t[0] = a[i];
break;
}
i++;
}
i = i + 1;
while (i < a.length() && i < b.length()) {
if (a[i] == b[i] && ((a[i] >= 'A' && a[i] <= 'N') || isdigit(a[i]))) {
t[1] = a[i];
break;
}
i++;
}
while (j < c.length() && j < d.length()) {
if (c[j] == d[j] && isalpha(c[j])) {
pos = j;
break;
}
j++;
}
string week[7] = {"MON ", "TUE ", "WED ", "THU ", "FRI ", "SAT ", "SUN "};
int m = isdigit(t[1]) ? t[1] - '0' : t[1] - 'A' + 10;
cout << week[t[0]-'A'];
printf("%02d:%02d", m, pos);
return 0;
}
#inlcude <map>
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
map的定义
map<int, string**//typename> name**
map的访问
数组访问:map[0] map['a''] map["ans"]...
数据的构造,插入
#include<map>
int main(){
map<int,string>mapStudent;
mapStudent.insert(pair<int,string>(1,"student_one"));
return 0;
}
int main(){
map<int,string>mapStudent;
mapStudent.insert(map<int,string>::value_type(1,"student_one"));
return 0;
}
//遍历:
map<string,CAgent>::iterator iter;
for(iter = m_AgentClients.begin(); iter != m_AgentClients.end(); ++iter)
{
if(iter->first=="8001") {
this->SendMsg(iter->second.pSocket,strMsg);//iter->first
}
}
//查找:
map<string,CAgent>::iterator iter=m_AgentClients.find(strAgentName);
if(iter!=m_AgentClients.end())//有重名的 {
}
else //没有{
}
//元素的个数
if (m_AgentClients.size()==0)
1069
#include <iostream>
#include <map>
using namespace std;
int main() {
int m, n, s;
scanf("%d%d%d", &m, &n, &s);
string str;
map<string, int> mapp;
bool flag = false;
for (int i = 1; i <= m; i++) {
cin >> str;
if (mapp[str] == 1) s = s + 1;
if (i == s && mapp[str] == 0) {
mapp[str] = 1;
cout << str << endl;
flag = true;
s = s + n;
}
}
if (flag == false) cout << "Keep going...";
return 0;
}
#include <set>
http://blog.csdn.net/yas12345678/article/details/52601454
set主要用于自动去重并按升序排序
set<int> test;
set插入数值: test.insert(0);
//不是使用push_back()哦
set删除一个特定数值 : test.erase(test.find(0));
清空set test.clear();
注意**set的遍历**
set<int>::iterator = it;
for(it = test.begin();it!=test.end();it++){
XXXXX
}
-
反向迭代器:
set<int>::reverse_iterator = it;
it.rbegin() 返回一个逆序迭代器,它指向容器it的最后一个元素
it.rend() 返回一个逆序迭代器,它指向容器it的第一个元素前面的位置
C/C++的输入
http://blog.csdn.net/JIEJINQUANIL/article/details/50802902
1052 1058
getchar(); 吸收诸如'()’、'【】'
http://blog.csdn.net/zcmuczx/article/details/53926178
http://blog.csdn.net/zcmuczx/article/details/53926352
1.cin最常见,不再多赘述,注意它在遇“空格”、“TAB”、“回车”都结束
2.cin.get(); 用来接收字符,可以接受“空格”
char c;
while(1){
c = cin.get();
cout<<c;
if(c==' '){
break;
}
}
-
(chat c = cin.get()) != EOF
#include <iostream>
using namespace std;
int main() {
int map[128] = {0}, c;
while ((c = cin.get()) != EOF) map[c]++;
while (map['P'] > 0 || map['A'] > 0 || map['T'] > 0 || map['e'] > 0 || map['s'] > 0 || map['t'] > 0) {
if (map['P']-- > 0) cout << 'P';
if (map['A']-- > 0) cout << 'A';
if (map['T']-- > 0) cout << 'T';
if (map['e']-- > 0) cout << 'e';
if (map['s']-- > 0) cout << 's';
if (map['t']-- > 0) cout << 't';
}
return 0;
}
3.cin.getline(); 接受一个字符串,可以接受“空格”并输出
#include <iostream>
using namespace std;
void main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}
//cin.getline()实际上有三个参数,cin.getline(接受字符串的首地址,接受个数5,结束字符)
//当第三个参数省略时,系统默认为’