首页 > 编程语言 >C++ string类

C++ string类

时间:2023-03-16 11:23:08浏览次数:33  
标签:字符 string C++ str name1 字符串 size

小引

C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

C++中就引入了String类,它可以看做是一个管理字符串的数据结构。总结:

string是表示字符串的字符串类。
该类的接口与常规容器的接口基本相同,还添加了一些专门用来操作string的常规操作。
string在底层实际是:basic_string模板类的别名。实现为:typedef basic_string<char, char_traits, allocator> string;
不能操作多字节或者变长字符的序列。

string类常用接口

常见构造

string()  构造空的string类对象,即空字符串
string(const char* s) 用C风格字符串string来构造string类对象
string(size_t n, char c)   string类对象中包含n个字符c
string(const string&s)  拷贝构造函数
string(const string&s, size_t n)  用s中的前n个字符构造新的string类对象



 

 

 

 

string name ="abc";
string name1("abc");
string name2(10,'a');
string name3(name1); //用name1构造name3
string name4(name1,2);//用name1的前两个字符构造name4

 

 

 size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。

clear()只是将string中有效字符清空,不改变底层空间大小。

resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

 

 

void TestString()
{
    string str;
    str.push_back(' '); // 在str后插入空格
    str.append("hello"); // 在str后追加一个字符"hello"
    str += 'b'; // 在str后追加一个字符'b'
    str += "it"; // 在str后追加一个字符串"it"
    cout << str << endl;
    cout << str.c_str() << endl; // 以C语言的方式打印字符串

    // 获取file的后缀
    string file1("string.cpp");
    size_t pos = file.rfind('.');
    string suffix(file.substr(pos, file.size() - pos));
    cout << suffix << endl;

    // npos是string里面的一个静态成员变量
    // static const size_t npos = -1;
    // 取出url中的域名
    string url("http://www.cplusplus.com/reference/string/string/find/");
    cout << url << endl;
    size_t start = url.find("://");
    if (start == string::npos){
        cout << "invalid url" << endl;
        return;
    }
    start += 3;
    size_t finish = url.find('/', start);
    string address = url.substr(start, finish - start);
    cout << address << endl;

    // 删除url的协议前缀
    pos = url.find("://");
    url.erase(0, pos + 3);
    cout << url << endl;
}
// 利用reserve提高插入数据的效率,避免增容带来的开销
//====================================================================================
void TestPushBack(){
    string s;
    size_t sz = s.capacity();
    cout << "making s grow:\n";
    for (int i = 0; i < 100; ++i){
        s += 'c';
        if (sz != s.capacity()){
            sz = s.capacity();
            cout << "capacity changed: " << sz << '\n';
        }
    }
}
void TestPushBack_P(){
    string s;
    s.reserve(100);
    size_t sz = s.capacity();

    cout << "making s grow:\n";
    for (int i = 0; i < 100; ++i){
        s += 'c';
        if (sz != s.capacity()){
            sz = s.capacity();
            cout << "capacity changed: " << sz << '\n';
        }
    }
}

 

标签:字符,string,C++,str,name1,字符串,size
From: https://www.cnblogs.com/wanglongjiang/p/17221654.html

相关文章

  • [牛客BM70&LeetCode322]零钱兑换Ⅰ——DFS,记忆化搜索,动态规划(C++)
    题目描述给你一个整数数组arr,表示不同面额的硬币;以及一个整数aim,表示需要放入钱包的目标金额。计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 05.认识GameMode&自动生成AI角色
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本篇文章将会讲述UE中Gamemode的基本概念,并在C++中开发GameMode,为游戏设置一个简单的玩法:使用环境查询自动......
  • 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 04.角色感知组件PawnSensingComponent
    斯坦福课程UE4C++ActionRoguelike游戏实例教程0.绪论概述本文章对应课程第十一章43、44节。本文讲述PawnSensingComponent中的视觉感知的使用,以及对AI角色平滑转身......
  • C++学习记录
    C++recordnotebook基础导论C++特性具有c访问硬件的能力和面向对象程序的属性,以及更具有泛型编程的功能(使用模板进行编程)。OOP(面向对象编程)其中的方法有:自顶向下和......
  • C++ 构造函数和析构函数
    构造函数和析构函数目录页面问题构造函数与析构函数初始化列表转换构造拷贝构造(这种都是浅拷贝,每一项成员依次拷贝过去)默认的赋值运算符小的总结页面构造/......
  • C++ 常用语法
    1.定义一个字符串常量staticconststd::stringversion("0.0.1");staticconststd::stringname("Car-"+version);2.定义size大小staticconstexpruint64_tsh......
  • C++风格 字符串操作
    获取字符串长度              str.size();或者str.length();连接字符串                     str=str+"world";删除字符串......
  • [计算机基础笔记] C/C++
    C语言面向过程,C++面向对象。面相过程的思维方式,它更加注重这个事情的每一个步骤以及顺序。他比较直接高效,需要做什么可以直接开始干。程序=算法+数据面向对象的思维方式......
  • C++学习笔记3
    18.虚析构问题提出:在继承关系中构造和析构什么时候被调用?假如当前有类CSon继承CFather构造:当newCSon的时候,就会调用CSon(),程序跳进CSon(),在CSon()里会先调用CFather(......
  • C++学习笔记4
    C++=C+面向对象+泛型编程+STL26.STL容器STL(标准模板库),它其中包含了:容器、迭代器、算法、空间配置器、配接器、仿函数六个部分,这里介绍一些容器以及几个简单算法......