C++ string类:高效处理字符串的必备技巧(上)

发布时间:2026/5/21 15:19:33

C++ string类:高效处理字符串的必备技巧(上) C string类高效处理字符串的必备技巧上文章目录C string类高效处理字符串的必备技巧上前言正文一.string的原型1.1string的来源1.2string的构造1.3析构函数1.4赋值运算符重载1.5operator[]重载1.6string的at使用方法二.三大遍历的方案2.1size()接口2.2使用operato[]进行遍历2.3使用迭代器进行遍历1.迭代器的定义2.迭代器的相关基本接口3.iterator使用样例及其注意事项2.4使用auto进行遍历1.auto的定义2.auto的使用三.容量相关的接口3.1string的resize()接口3.2string的capacity()接口3.3string的reserve()接口3.4string的clear()接口3.5string的empty()接口string的shrink_to_fit()接口||–|前言string 是什么它其实是 C 标准模板库STL中提供的一个字符串类专门用来处理字符串。但是相比于 C 语言中的字符数组string 提供了丰富的成员函数接口可以极大地简化字符串操作。我们本篇文章的主要内容就是讲解 string 中常用、重要的接口及其用法并会标记哪些是我们需要熟练掌握的。正文一.string的原型1.1string的来源下面这个意思是std::string 是 std::basic_string 的别名。1.2string的构造下面是cpp98提供string的构造函数一共是7个进行红色标记的是这几种构造函数中需要我们熟练掌握的。下面给出这个几种构造函数定义的形式默认构造拷贝构造字串的构造这里的3不给的话就会直接从第八个元素一直拷贝到最后一个元素。字符串构造取前N个字符进行构造填充构造迭代器构造这是七种string构造函数的形式,但是比较常用的是string的默认构造与带参构造和拷贝构造。我们需要熟练掌握这三种其余的是遇到了也不要陌生。1.3析构函数析构函数的模型在下面然后一般析构函数不需要我们去管他会自己调用。1.4赋值运算符重载第一种是用另一个 string 对象的内容来赋值。第二种是用 C 风格字符串以 \0 结尾的字符数组来赋值。第三种是用一个单个字符来赋值。赋值后字符串将只包含这一个字符。1.5operator[]重载std::string::operator[] 是 C 标准库中 std::string 类的成员函数用于通过下标访问字符串中的单个字符。它提供了类似数组的访问方式允许直接读取或修改特定位置的字符。我们可以通过这个运算符来直接修改字符串的内容让string的对象可以类似于数组一样被访问与修改。但是我们要注意它不检查越界与std::vector::operator[]类似不抛出异常。若 pos 无效如 pos size()行为未定义除非是非 const 版本且 pos size()。安全的替代方案使用 at(pos)会进行边界检查并在越界时抛出 std::out_of_range。但是vs中如果越界的话会直接崩溃的就如下面的样子1.6string的at使用方法at() 是 std::string 中带边界检查的访问函数与 operator[] 类似但越界时会抛出异常而不是未定义行为。它可以达到与[]一样的效果但是at会进行边界的检查如果越界访问的会抛出异常。而at与[]相比较的话at的访问速度是没有没有[]快的毕竟at需要进行边界的检查但是如果没有越界访问的风险的话还是推荐使用[]进行访问的。二.三大遍历的方案2.1size()接口size() 就是返回字符串中当前实际的字符个数不包括结尾的 \0。2.2使用operato[]进行遍历通过上述的知识我们可以知道通过[]这个运算符的重载让字符串有了像数组访问的可能。2.3使用迭代器进行遍历1.迭代器的定义在C编程中迭代器Iterator是一种用于遍历容器如数组、向量、列表等元素的对象。它提供了一种统一的访问方式允许程序员在不暴露容器内部实现细节的情况下高效地遍历和操作数据。迭代器类似于指针但支持更丰富的操作并能与标准模板库STL算法无缝集成。迭代器其实是一个抽象的概念不是一个具体的类它使用起来类似于指针但是他不是一个指针他只是一个抽象层。2.迭代器的相关基本接口3.iterator使用样例及其注意事项注意事项begin()指向的是第一个数据的位置end()指向的是数据的最后位置的下一位所以区间是左闭右开的。const修饰迭代器本身可以修改但是无法进行移动。const迭代器本身不可以修改但是可以移动2.4使用auto进行遍历1.auto的定义auto 是 C11 引入的关键字用于自动推导变量的类型。编译器会根据初始化表达式推断出变量的实际类型无需显式声明。它简化了代码编写尤其在处理复杂类型时如迭代器、lambda 表达式非常有用。2.auto的使用1.如何获取auto的类型呢我么需要使用到typeid这个关键词typeid 的作用是在运行时获取变量或类型的类型信息auto的使用样例注意事项auto在c11中是只能做返回值不可以做函数的的参数但是在c20中是可以做函数的普通参数。auto不可以定义数组因为我么不知道他的具体类型。三.容量相关的接口相关的接口Capacity:sizeReturn length of string (public member function)lengthReturn length of string (public member function)max_sizeReturn maximum size of string (public member function)resizeResize string (public member function)capacityReturn size of allocated storage (public member function)reserveRequest a change in capacity (public member function)clearClear string (public member function)emptyTest if string is empty (public member function)shrink_to_fitShrink to fit (public member function)这里的length是有局限性的不如size所以我们不需要多了解它然后还有max_size是没有什么作用的我们也不需要管。3.1string的resize()接口string::resize 是 C 标准库中 std::string 类的成员函数用于调整字符串的长度。该方法允许增加或减少字符串的当前长度并根据需要填充或截断字符。下面是使用的样例resize可以用来进行进行空间的改变如果使得长度变短的话就会发生截断这种截断会使得数据消失这种情况是不可逆的。resize也可以用来进行扩展空间新扩展的空间如果没有进行指定填充的话就就会自动填充‘\0’要是进行指定填充的话就会填充指定的内容。没有进行填充的3.2string的capacity()接口在C标准库中std::string类的capacity()成员函数用于查询字符串对象当前分配的内存容量。这个容量表示在不触发内存重新分配的情况下字符串可以存储的最大字符数不包括空终止符。在vs中扩容的时候第一次是按2倍扩容的第二次是1.5倍扩容的后面的话就有些没有那么标准了这是由多个原因导致的。3.3string的reserve()接口在C标准库中std::string::reserve是一个成员函数用于优化字符串的内存管理。它允许您预留特定数量的内存空间以减少在后续操作如添加字符中发生内存重新分配的次数从而提高程序性能。空间扩容的时候会影响效率这时候我们可以使用reserve先预留空间可以提高程序的运行效率。当reserve扩容的空间小于size的时候vs是不收缩的当reserve扩容的空间大于size小于capacity的时候vs还是不收缩当reserve扩容的空间大于capacity的时候。vs是会进行扩容的。3.4string的clear()接口clear() 用于清空字符串内容将字符串变为空字符串。运行的结果字符串全被清空了。但是要注意的是空间并没有被改变等价于str “”3.5string的empty()接口empty() 用于判断字符串是否为空即 size() 0。size0也可以用来进行判空但是更加推荐的是使用empty接口string的shrink_to_fit()接口shrink_to_fit() 用于请求释放多余的内存空间将 capacity() 减小到接近 size()。std::stringstr(100,x);std::cout1. capacity of str: str.capacity()\n;str.resize(10);std::cout2. capacity of str: str.capacity()\n;str.shrink_to_fit();std::cout3. capacity of str: str.capacity()\n;运行的结果这个接口并不会改变size的大小但是这个接口调用的时候并不保证成功。

相关新闻