一个string str="xie si yuan" 如果想拆分这个字符串,就是中间有空格的话就拆分,也对vector容器和迭代器有一个稍微的了解
来看源代码
#include<iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;
vector<string> division_word(const string &str);
int main()
{
string str="hello liuan cert hshhss";
vector<string> display;
display=division_word(str); //容器display 保存分割后的字符串
//size_type 是保存容器大小的变量
for ( vector<string>::size_type i=0;i !=display.size();++i )
{
cout<<display.at(i)<<endl;
}
vector<string>::iterator iter=display.begin();//定义一个string 型的迭代器,指向display的首地址 注意迭代器的类型和容器的类型匹配,迭代器的实质是指针,但是比指针使用更加安全
for(;iter!=display.end();iter++)
{
cout<<(*iter)<<"/t"; //利用迭代器把容器遍历
}
cout<<endl;
cout<<"display.size()="<<display.size();
system("pause");
return 0;
}
vector<string> division_word(const string &str)
{
vector<string> temp; //临时容器
typedef string::size_type string_size; //string::size_type 是一个typtdef,其实就是size_t 用来保存其长度
string_size i=0;
while (i!=str.size())
{
//检测空白符,找到第一个不是空白符的字符
while(i !=str.size() && isspace(str[i])) //
++i;
string_size j=i;
//从i查找下一个空白符
while(j !=str.size() && !isspace(str[j]) )//isspace(int c) 判断c是否是一个空字符 空返回非零即 1 非空返回0
++j;
if (i!=j) //j最后是下一个非空字符位置
{
/*如果两者 [i,j)区域存在的话,
把从i索引开始的j-i个字符也就是单词复制到temp中
在继续查找
public String substring(int beginIndex, int endIndex)返回一个新字符串,它是此字符串的一个子字符串。
该子字符串从指定的 beginIndex 处开始,一直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。 */
temp.push_back(str.substr(i,j-i)); //将该字符串压入vector
i=j;
}
}
return temp;
}
此外substring还有另外一种用法,public String substring(int beginIndex)返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 例如
"unhappy".substring(2) returns "happy"
isspace(int _c)参数是int型的,如果传入的是char型的,会利用ASCII码转换
vector是C++标准模板库的内容
它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
简单的使用方法如下:
vector<int> test;//建立一个vector
test.pushback(1);//把1和2压入vector 这样test[0]就是1,test[1]就是2
test.pushback(2);
在上面使用迭代器时候使用的str.end()返回的是迭代器的终止位置,并不是迭代器的大小,