3. 入门并实践STL——string篇
2019-03-01 本文已影响0人
zju_dream
string
- how to use?
#include<string>
using namespace std;
-
string的定义
- string str;
- 初始化,string str = "abc";
-
string的输入与输出
- 简单方法:使用cin与cout
- 使用scanf与printf:如何使用scanf读取string
-
string中内容的访问
- 通过下标:
str[1]
- 通过迭代器访问
- 一般使用第一种即可满足访问要求,但是有些函数比如
insert()
和erase()
要求以迭代器为参数 string::iterator it = str.begin();
- 一般使用第一种即可满足访问要求,但是有些函数比如
- string和vector一样,支持直接对迭代器进行加减某个数字,如
str.begin() + 3
的写法是可行的。
- 通过下标:
-
常用函数解析
-
operator+=: 将两个string直接拼接起来
-
compare operator: 用于比较大小,比较规则是字典序
- ==
- !=
- <
- <=
- >
- >=
-
size()
与length()
: 存放的字符数,O(1) -
insert()
, O(n)-
insert(pos, string)
: 在pos位置插入字符串string。例:str.insert(1, "xy"); // 在str[1]处插入,str变成axybc
-
insert(it, it2, it3);
: it为原字符串插入的位置,it2和it3为需插入字符串的首尾地址。
-
-
erase()
- 删除单个元素:
str.erase(it);
- 删除一个区间内的所有元素:
str.erase(first, last)
, 删除[first, end) - 时间复杂度都为O(n)
- 删除单个元素:
-
clear()
, O(1) -
substr()
:subtr(pos, len);
返回从pos号开始,长度为len的字串,O(len) -
string::npos
: 值为-1,用以作为find
函数失配时的返回值。 -
find()
:-
str.find(str1);
,当str1时str的字串时,返回str中第一次出现的位置,如果str2不是str的字串则返回string::npos -
str.find(str1, pos)
; 从pos号位开始匹配str2 - 时间复杂度:O(nm), n和m为两个字符串的长度。
-
-
replace()
str.replace(pos, len, str2);
-
str.replace(it1, it2, str2);
: 把[it1, it2)范围的字串替换成str2 - 时间复杂度:O(str.length())
-
习题
- 解析
- 数字的形态可分为
- 0.abc...
- abcd(...).qwe
- 剔除前导0,查找'.'的位置,记录指数的大小,删除".",第一个非零位的0全部删除(小数)
- 整理后的字符串,长度不够补长度,长度够了进行截断。
- 数字的形态可分为
#include<iostream>
#include<string>
using namespace std;
int N;
string deal(string str, int& e) {
while(str.length() > 0 && str[0] == '0') {
str.erase(str.begin());
}
// str is less than 1
if(str[0] == '.') {
str.erase(str.begin());
while(str.length() > 0 && str[0] == '0') {
str.erase(str.begin());
e--;
}
}
//str is larger than 1
else {
// to find '.'
int k = 0;
while(k < str.length() && str[k] != '.') {
k++;
e++;
}
// it means we find '.', then we delete it.
if(k != str.length()) {
str.erase(str.begin() + k);
}
}
int len = str.length();
if(len == 0) e = 0;
while(len++ < N) {
str += "0";
}
str = str.substr(0, N);
return str;
}
int main() {
scanf("%d", &N);
// the input is too large, so we can't use integer to store them.
//
string a, b;
cin >> a >> b;
int e1 = 0;
int e2 = 0;
a = deal(a, e1);
b = deal(b, e2);
if(a == b && e1 == e2) {
printf("YES 0.%s*10^%d\n", a.c_str(), e1);
}
else {
printf("NO 0.%s*10^%d 0.%s*10^%d\n", a.c_str(), e1, b.c_str(), e2);
}
system("pause");
return 0;
}