第四章-string/KMP/浮点数加法/stringstream

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值