C++——std::String
写在前⾯
这⼀篇博客系统学习⼀下C++中String类的相关函数。这个类在之前做题的时候就经常遇到,其实说⽩了,它也就是⼀个vector < char >。但是,它⼜有⼀些独特的函数,可以在做题的时候简化代码,提⾼效率。所以在这⼀篇博客,就根据CPlusPlus官⽹中< string >中的内容做⼀个整理。
⾃⼰整理之外,还有⼀些优秀的整理资料可供参考:。
string类与头⽂件包含
string即为字符串。string是C++标准库的⼀个重要的部分,主要⽤于字符串处理。可以使⽤输⼊输出流⽅式直接进⾏操作,也可以通过⽂件等⼿段进⾏操作。同时C++的算法库对string也有着很好的⽀持,⽽且string还和c语⾔的字符串之间有着良好的接⼝。虽然也有⼀些弊端,但是瑕不掩瑜。 头⽂件引⽤如下:
#include <string>
string::string
以下代码是string构造的⼏种⽅法,代码来⾃
// string constructor
#include <iostream>
#include <string>
int main ()
{
std::string s0 ("Initial string");  //根据已有字符串构造新的string实例
// constructors used in the same order as described above:
std::string s1;            //构造⼀个默认为空的string
std::string s2 (s0);        //通过复制⼀个string构造⼀个新的string
std::string s3 (s0, 8, 3);    //通过复制⼀个string的⼀部分来构造⼀个新的string。8为起始位置,3为偏移量。
std::string s4 ("A character sequence");  //与s0构造⽅式相同。
std::string s5 ("Another character sequence", 12);  //已知字符串,通过截取指定长度来创建⼀个string
std::string s6a (10, 'x');  //指定string长度,与⼀个元素,则默认重复该元素创建string
std::string s6b (10, 42);      // 42 is the ASCII code for '*'  //通过ASCII码来代替s6a中的指定元素。
std::string s7 (s0.begin(), s0.begin()+7);  //通过迭代器来指定复制s0的⼀部分,来创建s7
std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
return0;
}
//Output:
//s1:
/
/s2: Initial string
//s3: str
//s4: A character sequence
//s5: Another char
//s6a: xxxxxxxxxx
//s6b: **********
//s7: Initial
总结⼀下,string创建的⽅式相当灵活。我在此尝试对上⾯所述⽅法进⾏⼀个简单的分类整理:
⽆任何参数:按照默认⽅式构造⼀个空string。
已知字符串”abcde…”:可以将已知字符串作为参数传⼊,也可以传⼊⼀个int型参数,i,意为取已知字符串从0到i-1长度的⼦字符串。或者传⼊两个int型i,j,前⼀个int指起始位置i,从i+1开始数j个元素作为新⼦字符串。
指定sting长度:指定string长度i,与字符a,则默认重复a直到string长度为i。这⾥字符可以是ASCII码,也可以直接打出’a’。
已知string:可以根据别的string创建新的string。传⼊名称,则全部复制,传⼊名称且加上迭代器指定的起始位置与终⽌位置可以复制被拷贝string 的⼀部分。
string::operation =
使⽤ = 运算符也可以创建string。可参考如下代码:
// string assigning
#include <iostream>
#include <string>
int main ()
{
std::string str1, str2, str3;
str1 = "Test string: ";  // c-string      //通过=运算符来给已创建的string“赋值”
str2 = 'x';              // single character
str3 = str1 + str2;      // string
//注意这⾥重载了"+",string类的"+"可以理解为胶⽔,将两个string类型连接起来了
std::cout << str3  << '\n';
return0;
}
//Output:
//Test string: x
string-Iterators
string也有迭代器,熟练掌握迭代器的使⽤,有时能避免繁杂的for循环,但代码更有灵活性。
可以使⽤迭代器来实现遍历,代码如下:
// string::begin/end
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for ( std::string::iterator it=str.begin(); it!=d(); ++it)
std::cout << *it;
std::cout << '\n';
return0;
}
//Output:
//Test string
string-capacity
1.string::size:返回string的长度。⽰例代码如下
// string::size
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "The size of str is " << str.size() << " bytes.\n";
return0;
}
//Output:
//The size of str is 11 bytes
2.string::length:返回string的长度。⽰例代码如下
// string::length
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "The size of str is " << str.length() << " bytes.\n";
return0;
}
//Output:
/
/The size of str is 11 bytes
⽐较⼀下size与length,其实⼆者没有任何区别,length是因为沿⽤C语⾔的习惯⽽保留下来的,string类最初只有length,引⼊STL之后,为了兼容⼜加⼊了size,它是作为STL容器的属性存在的,便于符合STL的接⼝规则,以便⽤于STL的算法。
3.string::capacity:返回在重新分配内存之前,string所能包含的最⼤字符数。
4.string::max_size:返回⼀个string最多能够包含的字符数。以上两个函数⽰例代码参见如下:
// comparing size, length, capacity and max_size
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "size: " << str.size() << "\n";
std::cout << "length: " << str.length() << "\n";
std::cout << "capacity: " << str.capacity() << "\n";
std::cout << "max_size: " << str.max_size() << "\n";
return0;
}
//A possible output for this program could be:
//size: 11
//length: 11
//capacity: 15
//max_size: 4294967291
更加详细的解释可以参考:。
5.string::resize:将string的长度更改为⼀个指定参数的长度。如果n⼩于当前字符串的长度,则将当前值缩短为前n个字符,除去超出n的字符。如果n⼤于当前字符串长度,则通过在最后插⼊尽可能多的字符以达到⼤⼩n来扩展当前内容。 如果指定了c,则将新元素初始化为c 的副本,否则,它们是值初始化的字符(空字符)。
⽰例代码如下:
// resizing string
#include <iostream>
#include <string>
int main ()
{
std::string str ("I like to code in C");
std::cout << str << '\n';
unsigned sz = str.size();
std::cout << str << '\n';
std::cout << str << '\n';
return0;
}resize函数c++
//Output:
//I like to code in C
//I like to code in C++
/
/I like to code
6.string::reserve:请求更改容量。要求字符串容量适应规划的尺⼨变化,长度最多为n个字符。如果n⼤于当前的字符串容量,该函数将使容器将其容量增加到n个字符(或更⼤)。在所有其他情况下,它将作为⼀个⽆约束的请求来缩⼩字符串容量:容器实现可以⾃由地进⾏优化,并且使字符串的容量⼤于n。这个函数对字符串长度没有影响,也不能改变它的内容。
其实简单点说,就是该函数更改了string的容量capaticy,并没有实际更改size。更多内容可以参考。
7.string::clear:擦除字符串的内容,成为⼀个空字符串(长度为0个字符)。调⽤⽅式:
str.clear();
8.string::empty:判断string其中内容是否为空。再判断⼀个string是否为空时,可以使⽤该函数,也可以使⽤size()函数与length()函数来获取string的长度,然后判断长度是否为0。但优先使⽤empty()函数,因为该函数运⾏速度更快。
string-element access
1.string::operator[]:获取字符串的字符,返回字符串中位置pos处字符的引⽤。⽰例代码如下:
// string::operator[]
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for (int i=0; i<str.length(); ++i)
{
std::cout << str[i];
}
return0;
}
//Output:
//Test string
2.string::at:获取字符串中的字符,返回字符串中位置pos处字符的引⽤。该函数⾃动检查pos是否是字符串中字符的有效位置(即pos是否⼩于字符串长度),如果不是,则会抛出out_of_range异常。⽰例代码如下
// string::at
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for (unsigned i=0; i<str.length(); ++i)
{
std::cout << str.at(i);
}
return0;
}
//Output:
//Test string
operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。[]访问的速度⽐at()要快,但不作越界检查.⽤[]访问之前, 要对下标进⾏检查( > string::npos && < string::size())
3.:string::back:访问最后⼀个字符,返回对字符串最后⼀个字符的引⽤。这个函数不能在空字符串上调⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。