string是c++中常见的一个使用类,因为对字符串的操作的频繁性,string类的重要性是不言而喻的,那么了解string类,首先我们从对它的使用开始。
构造:
一般情况下,构造的使用是用字符或者字符串去初始化的,但初始化的方式也有很多种情况
string s;
string s1("hello");
string s2(s1,1,3);//从s1的第一个字符位置拷贝三个字符
string s3(s1);
string s4= s1;
string s5 ="hello";
string s6('a');
以上的都可以是string的实例化。我们大多数用的还是用字符串进行初始化,或者拷贝构造。
遍历:
string类的遍历有三种方式,用下标,迭代器,范围for
for(int i =0;i<s1.size();i++)
{
cout << s1[i] << endl;
}
string::iterator it = s1.begin();
while(it != s1.end())
{
cout << *it << endl;
it++;
}
for(auto e: s)
{
cout<<e<<endl;
}
这里的迭代器,存在四种,分别是正向反向,常量非常量,两两组合。构成四种
string:: reverse_iterator rit = s1.rbegin();
while(rit != s1.rend())
{
cout << *rit << endl;
rit++;
}
//这是倒数的遍历
string:: const_iterator cit = s1.begin();
while(cit != s1.end())
{
cout<<*cit<<endl;
cit++;
}
这是常量迭代器,常量迭代器只能读不能写。
基本函数:
长度(大小)函数:size,length,两种函数的使用是一样的,但是由于早期普遍用线性结构,所以是长度,但是到现在,非线性结构的增多,所以size更能表达大小的意思。
capacity 返回容量。
clear 清楚数据但不释放空间。
max_size返回能达到的最大长度,一般无用。
一般频繁的申请空间会损耗效率,所以reserve来申请空间。
但一般的申请空间会存在内存对齐,所以申请的大小可能与实际的大小不一样。
resize会改变容量,也会改变存放的多少。
如果resize小于本来存放的字符,则会删除多余字符,如果多于本来字符就会,补充,如果大于容量,则会扩容。
string s1("hello");
s1.resize(2);
cout << s1<<endl;//he
s1.resize(4,'a');
cout <<s1<<endl;//heaa
s1.resize(8,'a');
cout << s1<<endl;//heaaaaaa 容量增大
字符串追加函数:
这里有三种函数,push_back append +=
第一个是追加字符的,第二个是追加字符串的,第三个什么都可以追加。
一般我们用第三个。不仅形象而且方便。
string s;
s.push_back('a');//a
s.append("bbbb");//abbbb
s+='c';//abbbbc
s+="dd";//abbbbcdd
一般我们还可以在具体位置插入字符或者字符串。
有insert和erase函数。
s.insert(s.begin(),'a');//在头部插入a字符
cout<<s<<endl;
s.erase(2,2);//在第二下标位置删除两个字符,不写长度默认全删
cout<<s<<endl;
我们还可以用c_str的方式去返回c形式的字符串,用c去遍历。等同于返回了首字符地址。
cout << s.c_str()<<endl;
cout << s<<endl;
这两种方式都可以遍历字符串,但是不同点是,第一种是遇到‘\0’就结束了,因为c中是以这个字符为字符串截止标志,但是在c++string类中,不是这样的,它是直接讲其遍历完全,即,如果中间出现‘\0’的话,前者会停止遍历,而后者还是会遍历。
字符串查找与子串处理。
find和substr是查找与子串寻找。下面来看一个网址分割的例子
void divulr(const string& s)
{
size_t pos = s.find(':');//从头开始查找字符:
if (pos != string::npos)
{
cout<<s.substr(0,pos)<<endl;//从头开始取长度为pos的子串
}
size_t pos2 = s.find('/', pos + 3);//从pos+3的位置找/
if (pos2 != string::npos)
{
cout << s.substr(pos + 3, pos2 - pos - 3) << endl;
}
cout << s.substr(pos2+1) << endl;
}
以上为基本的使用方法。还有如果字符串需要空格,如单词,那么就需要使用getline函数来输入字符,因为cin是遇到空格和换行就结束了,但是getline只遇到换行才结束。
getline(cin,s);