这个系列的博客是我在工作中对于本科学习的C++的复习与反思,工作了才发现之前学的C++真的太浅。
看了别人的代码,不懂得重新熟悉学习发出来
先贴代码
void split(const string& s, vector<double>& sv, const char flag = ' ') {
sv.clear();
istringstream iss(s);
string temp;
while (getline(iss, temp, flag)) {
sv.push_back(stoi(temp));
}
return;
}
这个代码可以将一个以特定符号分割的字符串如"3 4 6 134 56 -34"将其中的数字取出并以int数组的形式呈现。
其中所使用的
1、向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。需要使用include<vector>引入
http://www.runoob.com/w3cnote/cpp-vector-container-analysis.html
2、stoi()是将字符串转成int数的方式,对不合规格或超出int范围的数会抛出异常,其包含在std中,另一个函数atoi()作用相同不过不会在超出Int范围时抛出异常,而是返回上下界,它在标准库中。函数原型如下:
int stoi (const string& str, size_t* idx = 0, int base = 10);
其中:
str:字符串对象,表示整数。
idx:指向size_t类型对象的指针,其值由函数设置为数值后str中下一个字符的位置。此参数也可以是空指针,在这种情况下不使用它。
base:确定有效字符及其解释的数字基数(基数)。
如果为0,则使用的基数由序列中的格式确定(有关详细信息,请参阅strtol)。 请注意,默认情况下,此参数为10,而不是0。
这类常用函数还包括:
(1)stol 将字符串转换为long int
(2)stoul 将字符串转换为无符号整数 stoll 、stoull
(3)stof 将字符串转换为float
(4)stod 将字符串转换为double stold
3、getline的函数原型:
getline(char *sink, streamsize size, char delimiter='\n')
getline( istream &is, string str, char delimiter );
所以这个方法不止可以读取一行,还可以指定作为标志的字符来读取,如上面的例子代码中就是使用的' '空格符
4、 istringstream包含在<sstream>中(<sstream>包含<iostream>所以无需同时包含两者)
1 istringstream 从istream 派生从一个字符串中读取数据
2 ostringstream 从ostream 派生写入到一个字符串中
3 stringstream 从iostream 派生从字符串中读取或者写入到字符串中
这里是将一个字符串作为流来使用,而输出操作符可以接受任何内置数据类型的实参包括const char*,所以如代码:
string str="this is a test";
istringstream is(str);
string s;
while(is>>s)
{
cout<<s<<endl;
}
的输出将是:
this
is
a
test
而且也可以用这个方法做一个数据类型转换:
int a, b, c;
string s = "2 34 564";
istringstream ss(s);
ss >> a >> b >> c;
cout << a << " " << b << " " << c << " ";
的输出便是 2 34 564