string
构造
#include<string>
using namespace std;
string s0 = "Initial String";//用赋值
string s0 = string("Initial String");//用构造函数
string s4("A character sequence");//使用构造函数初始化,效果跟1同
string s1;//空串
string s2(s0);
string s2 = s0;
string s3(s0,8,3);//s0下标从8开始三个
string s3(s0,8);//s0下标从8开始直到结束
string s5("Another character sequence",12);//前十二个字符,不是12往后
string s5("Another character sequence",12,3);//从12开始(下标0开始)的三个字符!!
string s6(10,'x');//10个x构成的
string s6('x');错
string s6("x");对
string s6(1,'x');
char a = s0[2];//像字符数组那样去访问
//插入
s4.insert(5,s0);//从5开始插入不是复制,要后挪
s4.insert(5,s0,0,7);//把s0的0开始7个字符插到s4的0这里
s4.insert(5,s0,2);//把s0从2往后插到s4的0这里
s4.insert(6,"to be");
s4.insert(6,"to be",2);//前两个
s4.insert(6,"to be",2,3);//前两个
//对于"agfa"这种,n表示前n个,n,m表示从n开始(下标从0)的m个
//对于str n表示从n开始 ,n,m表示从n开始(下标从0)的m个
//删除
s4.erase(7);//从7开始后边的都删了
s4.erase(7,2);//从7开始的两个从中删除,后边填上
s4.clear();//清空
//加法等于拼接
str1 += str2;
str3 = str4 + str5 + " n" + 'a';
//比较
> >= == != < <=
//函数
str.size();
int position = str.find("world");
int position = str.find("world",10);//从10开始找
int position = str.find('w');
int position = str.find('w',10);
找不到返回-1
str.empty();//true false
str.begin();
str.end();
sort(str.begin(), str.end());//字符串的末尾(最后一个字符的下一个位置)
sting str = str1.substr(13);//返回str1从13开始的字串
sting str = str1.substr(13,3);//返回str1从13开始的3个字串
cout << str;
cin >> str;
getline(cin,str);
char a = getchar();
while (cin >> str1 >> str2) {//cin会自动判断文件结尾
while (getline(cin, str)) {
读取一行用getline(cin, str);因为cin >> str遇到空符就结束;同样getline会判断文件结束,getline只能用于string;getline会读走回车
string *array = new string[str.size()];//动态创建str数组
vector<string> myVector;
string str = to_string(3.1415926);//返回的是"3.141593"
double转string自动保留6位
string str = to_string((int)3.1415926);//"3"
string str = to_string(444);
stringstream
对一行中的单词进行替换
#include <sstream>
using namespace std;
string line;
while (getline(cin, line)) {
string original, replace;
cin >> original >> replace;
stringstream stringStream = line;
string str;
while (stringStream >> str) {
if (str == original) cout << replace << " ";
else cout << str << " ";
}
}
还可以
stream >> val >> a >> str2;
#include<iostream>
char a = 'a';
char b = toupper(a);//'A',大写字母也可以
char c = tolower(b);//'a'
int d = isalpha(a);//是字母返回非零,否则零
KMP
http://acm.hdu.edu.cn/showproblem.php?pid=1711
http://poj.org/problem?id=3461
http://dwz.win/GMr
如果O(mn)大于1e7就用这个,否则用朴素也行
int nextTable[MAXM];
string pattern,text;
void GetNextTable(int m){//m是模式串长度
int j = 0;
nextTable[0] = -1;
int t = nextTable[0];
while(j < m){
if(t == -1 || pattern[j] == pattern[t]){
j++,t++;
nextTable[j] = t;
}else t = nextTable[t];
}
}
int kmp(int n,int m){
GetNextTable(m);
int i = 0,j = 0;
while(i < n && j < m){
if(j == -1 || text[i] == pattern[j]) i++,j++;
else j = nextTable[j];
}
return j == m ? i - j : -1;//返回第一个匹配成功的下标
}
int kmpCount(int n,int m){//返回匹配成功次数
GetNextTable(m);
int number = 0;
int i = 0,j = 0;
while(i < n){
if(j == -1 || text[i] == pattern[j]) i++,j++;
else j = nextTable[j];
if(j == m){
number++;
j = nextTable[j];//可以重复;j = 0不可重复
}
return number;
}
浮点数加法
/*
* 题目名称:浮点数加法
* 题目来源:北京大学复试上机题
* 题目链接:http://t.cn/Ai8I4v0j
* 代码作者:杨泽邦(炉灰)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include<string>
using namespace std;
string Add(string str1, string str2) {
string fractional1 = str1.substr(str1.find('.') + 1);
string fractional2 = str2.substr(str2.find('.') + 1);
if (fractional1.size() < fractional2.size()) { //小数对齐
fractional1 = fractional1 + string(fractional2.size() - fractional1.size(), '0');
}
else {
fractional2 = fractional2 + string(fractional1.size() - fractional2.size(), '0');
}
string integral1 = str1.substr(0, str1.find('.'));
string integral2 = str2.substr(0, str2.find('.'));
if (integral1.size() < integral2.size()) { //整数对齐
integral1 = string(integral2.size() - integral1.size(), '0') + integral1;
}
else {
integral2 = string(integral1.size() - integral2.size(), '0') + integral2;
}
int carry = 0;
string fractional(fractional1.size(), ' ');
for (int i = fractional.size() - 1; i >= 0; --i) { //小数相加
int current = fractional1[i] - '0' + fractional2[i] - '0' + carry;
fractional[i] = current % 10 + '0';
carry = current / 10;
}
string integral(integral1.size(), ' ');
for (int i = integral.size() - 1; i >= 0; --i) { //整数相加
int current = integral1[i] - '0' + integral2[i] - '0' + carry;
integral[i] = current % 10 + '0';
carry = current / 10;
}
if (carry != 0) {
integral = to_string(carry) + integral;//to_string();将数值转成字符串,返回string
}
for (int i = fractional.size() - 1; i >= 0; i--) {
if (fractional[i] == '0') fractional.erase(i);//不存在fractional -= '0',只有+=,-=要用str.erase()
else break;
}
return fractional.size() > 0 ? integral + '.' + fractional : integral;
}
int main() {
string str1, str2;
while (cin >> str1 >> str2) {
cout << Add(str1, str2) << endl;
}
return 0;
}