C++——string类的使用

简介: C++——string类的使用

1、string的构造


       在  c plus plus  这个网站上可以查到相关的信息,



(1)是无参构造函数(也是默认构造),就是一个空字符串



(2)是一个拷贝构造,传入一个参数构造字符串




(3)是一个有参构造,参数有点复杂,他有一个字符串,在字符串的pos位置,取len个字符,这个len有缺省值,len=npos,npos是一个无符号整型的-1,表示此类型的最大值,也就是无符号整形中最大的值,


假设我们不给len传参,就是从pos位置,取到字符串的末尾,然后赋值给s3;



我们给len赋值,就是从pos位置取len个字符,然后赋值给s3;



(4)是用一个C-string来构建,C-string指的就是结尾带/0的字符串,



(5)是取字符串前n个字符



(6)是构造n个’c'字符,组成字符串



标红的用的比较多,要重点记

2、string类对象的容量操作

1.size  

返回字符串有效字符长度;


返回的字符的个数,但是不包括  ‘\0’, 其实string类的结尾是有\0的,因为要兼容C语言,

2.length


返回字符串有效字符长度,作用和size差不多,但我们经常用size;


3.resize

调整字符串大小


将字符串大小调整为 n 个字符的长度


如果 n 小于当前字符串长度,则当前值将缩短为其第一个 n 个字符,从而删除第 n个字符之外的字符。


如果 n 大于当前字符串长度,则通过在末尾插入所需数量的字符来扩展当前内容,以达到 n 的大小。如果指定了 c,则新元素将初始化为 c 的副本,否则,它们是值初始化的字符(空字符)。



注意:

当我们要插入字符时,从字符串末尾的位置插入,也就是\0的位置最后一行打印的,末尾其实还有5个\0,我们看不出来,


4.capacity

返回空间总大小


因为字符串可以自动扩容,所以他有个容量接口,但是不同编译器下,扩容的规则不一样,有的是二倍扩容,有的是1.5倍扩容,

5.max_size

字符串的最大长度



max_size是指在当前环境下,可以达到字符串的最大长度;


6.reserve

为字符串预留空间



string s1.reserve(100);


就是为字符串一次性开辟100个字节的空间,比较方便;

7.clear

清空有效字符



清除一个string类的有效字符,但是空间还在,

8.empty

判断字符串是否为空



9.reverse

反转字符串



这个好像涉及到迭代器,比如我们要反转一个字符串


verse( s1.begin(),s1.end() )


这样写就可以了

3、operator[]以及string类的遍历


string类还重载了[]类型,可以去到字符的下标,和数组类似,


// 1. for+operator[]
  for (size_t i = 0; i < s.size(); ++i)
    cout << s[i] << endl;
 
  // 2.迭代器
  string::iterator it = s.begin();
  while (it != s.end())
  {
    cout << *it << endl;
    ++it;
  }
 
  // string::reverse_iterator rit = s.rbegin();
  // C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
  auto rit = s.rbegin();
  while (rit != s.rend())
    cout << *rit << endl;
 
  // 3.范围for
  for (auto ch : s)
    cout << ch << endl;
}


4、string类对象的修改操作

1.operator+=

字符串可以+=一个字符串或者字符或string类




非常好用



2.append

追加字符串



不过平时用的少,我们可以通过一些例子来说明:


void test_string3()
{
  std::string str;
  std::string str2 = "Writing ";
  std::string str3 = "print 10 and then 5 more";
 
  // used in the same order as described above:
  str.append(str2);                       // "Writing "
  str.append(str3, 6, 3);                   // "10 "
  str.append("dots are cool", 5);          // "dots "
  str.append("here: ");                   // "here: "
  str.append(10u, '.');                    // "..........",10u表示10是一个无符号整形
  str.append(str3.begin() + 8, str3.end());  // " and then 5 more"
 
  std::cout << str << '\n';
}


3.push_back

尾插一个字符,空间不够自动扩容



4.assign

替换当前字符串的值




和append格式一样,但是作用不一样;

// string::assign
#include <iostream>
#include <string>
 
int main ()
{
  std::string str;
  std::string base="The quick brown fox jumps over a lazy dog.";
 
  // used in the same order as described above:
 
  str.assign(base);
  std::cout << str << '\n';
 
  str.assign(base,10,9);
  std::cout << str << '\n';         // "brown fox"
 
  str.assign("pangrams are cool",7);
  std::cout << str << '\n';         // "pangram"
 
  str.assign("c-string");
  std::cout << str << '\n';         // "c-string"
 
  str.assign(10,'*');
  std::cout << str << '\n';         // "**********"
 
  str.assign<int>(10,0x2D);
  std::cout << str << '\n';         // "----------"
 
  str.assign(base.begin()+16,base.end()-12);
  std::cout << str << '\n';         // "fox jumps over"
 
  return 0;
}

5.insert

在字符串中插入其他字符串



样例:

// inserting into a string
#include <iostream>
#include <string>
 
int main ()
{
  std::string str="to be question";
  std::string str2="the ";
  std::string str3="or not to be";
  std::string::iterator it;
 
  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )
 
  std::cout << str << '\n';
  return 0;
}



6.erase

销毁当前字符串



7.replace


替换 字符串的一部分


和assign的区别是,assign把整个字符串都替换了,replace可以替换部分字符串

5、string类对象的字符串操作

1.c_str


把string类转化成字符串类型;




2.copy


从字符串中赋值一段字符串,赋值给指定的字符数组



// string::copy
#include <iostream>
#include <string>
 
int main ()
{
  char buffer[20];
  std::string str ("Test string...");
  std::size_t length = str.copy(buffer,6,5);
  buffer[length]='\0';
  std::cout << "buffer contains: " << buffer << '\n';
  return 0;
}

3.find

在字符串里查找字符或者字符串或者string类



(3)的意思是在字符串中查找s,在pos位置,查找s的n个字符;

4.rfind

倒着查找,其他的和find一样



5.substr

在字符串中从pos位置开始,截取n个字节,然后返回




// string::substr
#include <iostream>
#include <string>
 
int main ()
{
  std::string str="We think in generalities, but we live in details.";
                                           // (quoting Alfred N. Whitehead)
 
  std::string str2 = str.substr (3,5);     // "think"
 
  std::size_t pos = str.find("live");      // position of "live" in str
 
  std::string str3 = str.substr (pos);     // get from "live" to the end
 
  std::cout << str2 << ' ' << str3 << '\n';
 
  return 0;
}


6.getline

流输入一行字符串



通常我们用的cin输入,遇到空格或者换行就会停止,用getline可以很好的解决这个问题,


#include <iostream>
#include <string>
 
int main ()
{
  std::string name;
 
  std::cout << "Please, enter your full name: ";
  std::getline (std::cin,name);
  std::cout << "Hello, " << name << "!\n";
 
  return 0;
}


相关文章
|
2月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
2月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
26天前
|
设计模式 安全 C++
【C++进阶】特殊类设计 && 单例模式
通过对特殊类设计和单例模式的深入探讨,我们可以更好地设计和实现复杂的C++程序。特殊类设计提高了代码的安全性和可维护性,而单例模式则确保类的唯一实例性和全局访问性。理解并掌握这些高级设计技巧,对于提升C++编程水平至关重要。
45 16
|
26天前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
52 11
|
19天前
|
编译器 C++
类和对象(中 )C++
本文详细讲解了C++中的默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载和取地址运算符重载等内容。重点分析了各函数的特点、使用场景及相互关系,如构造函数的主要任务是初始化对象,而非创建空间;析构函数用于清理资源;拷贝构造与赋值运算符的区别在于前者用于创建新对象,后者用于已存在的对象赋值。同时,文章还探讨了运算符重载的规则及其应用场景,并通过实例加深理解。最后强调,若类中存在资源管理,需显式定义拷贝构造和赋值运算符以避免浅拷贝问题。
|
19天前
|
存储 编译器 C++
类和对象(上)(C++)
本篇内容主要讲解了C++中类的相关知识,包括类的定义、实例化及this指针的作用。详细说明了类的定义格式、成员函数默认为inline、访问限定符(public、protected、private)的使用规则,以及class与struct的区别。同时分析了类实例化的概念,对象大小的计算规则和内存对齐原则。最后介绍了this指针的工作机制,解释了成员函数如何通过隐含的this指针区分不同对象的数据。这些知识点帮助我们更好地理解C++中类的封装性和对象的实现原理。
|
1月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
30天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
87 6
|
2月前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)
|
1月前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化