1073. Scientific Notation <string>

来源:互联网 发布:贪玩蓝月转生修为数据 编辑:程序博客网 时间:2024/06/11 08:05

题目链接:http://pat.zju.edu.cn/contests/pat-a-practise/1073

string

既然用到了string,我们就回顾一下常用的string接口,每一个接口都有几种重载,只需会用常用的即可。

size()/begin()/end()就不提了。

首先给出一个网址(http://www.com/reference/string/string/),自己经常参考一些C++信息。

1. find()

size_t find (const string& str, size_t pos = 0) const noexcept;size_t find (const char* s, size_t pos = 0) const;size_t find (const char* s, size_t pos, size_type n) const;size_t find (char c, size_t pos = 0) const noexcept;
find返回下标。

各参数:
str: 查找str第一次出现的位置。

s:   查找C语言字符串s第一次出现的位置。

c:   查找字符c第一次出现的位置。

pos: 从pos处开始查找,包括pos。

n:   需要匹配的位数。

因此,我们常用的是:

size_t find (const string& str, size_t pos = 0) const noexcept;size_t find (const char* s, size_t pos = 0) const;size_t find (char c, size_t pos = 0) const noexcept;

2. erase()

接口声明见:http://www.cplusplus.com/reference/string/string/erase/。

sequence (1)

 string& erase (size_t pos = 0, size_t len = npos);
character (2)
iterator erase (const_iterator p);
range (3)
iterator erase (const_iterator first, const_iterator last);

(1) 按下标删除:区间为[pos, pos+npos); npos为需要删除的数量,pos为开始位置。

(2) 按迭代器删除一个字符:给出迭代器p。

(3) 按迭代器删除一个区间:给出2个迭代器first和last。

其实,如果删除一个字符k,直接使用

str.erase('k');

3. insert()

重载比较多大笑

string (1)

 string& insert (size_t pos, const string& str);
substring (2)
 string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
c-string (3)
 string& insert (size_t pos, const char* s);
buffer (4)
 string& insert (size_t pos, const char* s, size_t n);
fill (5)
 string& insert (size_t pos,   size_t n, char c);iterator insert (const_iterator p, size_t n, char c);
single character (6)
iterator insert (const_iterator p, char c);
range (7)
template <class InputIterator>iterator insert (iterator p, InputIterator first, InputIterator last);
initializer list (8)
 string& insert (const_iterator p, initializer_list<char> il);
常用的有:

(1) 在pos处开始插入str。

(3) 在pos处开始插入C语言字符串s。

(4) 在pos处开始插入C语言字符串s的前n位。

(5) 在pos处开始插入n个字符c。两种形式,如果使用0作为下标,他不知道你这个是下标还是迭代器的!

如果在开始插入字符,不应使用:s1.insert(0, n, '0');  在结尾处插入使用s1.insert(s1.end(), n, '0');  其他位置的插入,可以使用下标。 比如:s1.insert(1, n, '0');

4. replace()

这个也不省心。

string (1)

string& replace (size_t pos,        size_t len,        const string& str);string& replace (const_iterator i1, const_iterator i2, const string& str);
substring (2)
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
c-string (3)
string& replace (size_t pos,        size_t len,        const char* s);string& replace (const_iterator i1, const_iterator i2, const char* s);
buffer (4)
string& replace (size_t pos,        size_t len,        const char* s, size_t n);string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);
fill (5)
string& replace (size_t pos,        size_t len,        size_t n, char c);string& replace (const_iterator i1, const_iterator i2, size_t n, char c);
range (6)
template <class InputIterator>  string& replace (const_iterator i1, const_iterator i2,                   InputIterator first, InputIterator last);
initializer list (7)
string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);
这个的参数分布还是比较有规律的:3个参数(4个的那个目前没用过),前两个为范围,可以是下标或者迭代器,最后有一个是字符串,或者字符。

5. substr()

string substr (size_t pos = 0, size_t len = npos) const;
看起来很简单,确实挺简单:开始位置pos,长度npos。

6.总结

如果用下标,参数pos为开始位置,如果是一个范围npos是长度。如果是迭代器,老老实实范围两端的迭代器。


本题代码

// 这道题目用C的话,做起来比较繁琐。用stl会省事很多// 使用了find()/erase()/insert()/size()/begin()/end()#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>#include <iostream>#include <string>#include <vector>#include <stack>#include <queue>#include <set>#include <map>#include <algorithm>using namespace std;int main(){#ifdef ONLINE_JUDGE#elsefreopen("E:\\in.txt", "r", stdin);#endifchar buf[10000+10];gets(buf);string line = buf;//cout << "line:" << line << endl;if(line[0] == '-'){cout << '-';}string s1 = line.substr(1, line.find('E', 1)-1);//cout << "s1:" << s1 << endl;string s2 = line.substr(line.find('E', 1)+1, line.size());//cout << "s2:" << s2 << endl;int index = atoi(s2.c_str());//cout << "index:" << index << endl;s1.erase(s1.find('.'), 1);//cout << "s1:" << s1 << endl;if(index <0){index = -index;s1.insert(s1.begin(), index, '0');// 在开始处插入index个'0'/*---------------------------------------------------------  如果在开始插入字符,不应使用:s1.insert(0, index, '0');  在结尾处插入使用s1.insert(s1.end(), index, '0');  其他位置的插入,可以使用下标。  比如:s1.insert(1, index, '0');---------------------------------------------------------*/s1.insert(1, 1, '.');//cout << "s1:" << s1 << endl;cout << s1 << endl;}else{if(s1.size()-1 > index){s1.insert(index+1, 1, '.');}else if(s1.size() == index){//nothing}else{s1.insert(s1.end(), index+1 - s1.size(), '0');}cout << s1 << endl;}return 0;}


0 0
原创粉丝点击