C++中具有容器精神的类string

发布于:2024-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

1.容器、迭代器、算法

C++中的STL(Standard Template Library)由三大部分组成:容器(Containers)、迭代器(Iterators)和算法(Algorithms),这三者紧密协作,构成了一套强大的数据处理工具。

1.容器(Containers)

容器是用来存储数据的工具,它们是模板类,可以容纳不同类型的对象,如基本类型(int, double等)或用户自定义类型。C++ STL提供的容器类型多样,能够满足不同场景下的数据存储需求。主要分为两大类:

  • 顺序容器:元素在内存中连续存储,如vector、list、deque、array,适合需要快速随机访问的场景。
  • 关联容器:元素根据键(key)排序存储,如map、set、multimap、multiset,适合需要高效查找或保持唯一性的场景。
  • 无序关联容器:类似关联容器,但使用哈希表实现,如unordered_map、unordered_set等,适用于快速查找且不关心元素顺序的情况。
  • 容器适配器:基于其他容器实现特定接口,如stack、queue、priority_queue。
2.迭代器(Iterators)

迭代器是STL中用于遍历容器内元素的机制,它提供了一种统一的访问容器内数据的方式。迭代器就像是指针的概念扩展,可以认为是对不同容器内部元素的通用访问接口。迭代器有五种基本类别,分别对应不同的操作能力:

  • 输入迭代器(Input Iterators)
  • 输出迭代器(Output Iterators)
  • 前向迭代器(Forward Iterators)
  • 双向迭代器(Bidirectional Iterators)
  • 随机访问迭代器(Random Access Iterators)

迭代器使得STL算法能够不关心具体容器的内部实现,就能对容器中的数据进行操作。

3.算法(Algorithms)

STL算法提供了一系列标准的、高度优化的函数,用于执行常见的数据处理任务,如查找、排序、复制、累积等。这些算法通过迭代器来间接作用于容器中的数据,因此它们是泛型的,几乎可以应用于任何支持适当迭代器类型的容器上。这大大提高了代码的可复用性和灵活性。

算法与容器之间通过迭代器解耦,意味着算法不知道也不关心它们正在操作的数据存储在何种容器中,只需知道如何通过迭代器访问这些数据即可。这样设计既简化了算法的编写,也使得算法可以轻松应用于多种不同的容器类型。

综上所述,C++ STL中的容器、迭代器和算法形成了一个强大的生态系统,允许开发者高效地管理和操作数据,同时保持了代码的简洁性和高性能。

2.string容器

1.string容器构造函数
//
// Created by 86189 on 2024/6/25.
//
#include <iostream>
using namespace std;

int main(){
    string str;  // 创建一个字符串对象
    const char *s = "hello world!";
    str = string(s);  //string(const char *s)将S初始化为string字符串
    string string1(str);  //拷贝构造函数,将str拷贝给string1
    string str2 = string(10,'q'); // 生成10个q的字符串
    cout << str << endl;
    cout << string1 << endl;
    cout << str2 << endl;
    return 0;
}

在C++中,std::string虽然严格意义上不属于STL容器(因为它不直接继承自容器要求的基类模板),但它是一个非常重要的类,用于处理和存储字符串数据,功能上与容器相似,提供了很多容器类的特性。std::string是C++标准库的一部分,设计用来处理变长的字符序列,支持像容器一样的操作,如添加、删除、访问字符等。

std::string的主要特点包括:

  1. 动态大小:字符串的长度可以在运行时改变。
  2. 随机访问:可以通过索引(下标)访问单个字符,就像访问数组一样。
  3. 丰富的成员函数:提供了诸如size(), length()获取长度,append()追加字符串,erase()删除指定范围的字符,find()查找子串,以及substr()提取子串等众多实用功能。
  4. 迭代器支持std::string提供了迭代器,允许使用STL算法对其内容进行操作,如遍历、查找等。
  5. 构造和赋值:可以轻松地从C风格的字符串(char*)或其他std::string对象构造或赋值。
  6. 内存管理:自动管理内存,避免了手动处理字符数组时可能出现的内存泄漏问题。

由于其便捷性和灵活性,std::string在大多数涉及文本处理的C++程序中被广泛使用,尽管它在STL容器的正式分类之外,但从使用方式和功能上看,它与STL容器的精神是一致的。

3.string赋值操作

赋值操作函数原型:

string& operator=(const char*s);        //char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);     //把字符串s赋给当前的字符串
string& operator=(char c);              //字符赋值给当前的字符串
string& assign(const char *s);      //把字符串s赋给当前的字符串
string& assign(const char *s,int n);//把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);//把字符串s赋给当前字符串
string& assign(int n,char c);//用n个字符c赋给当前字符串

示例:

#include <iostream>
using namespace std;

void test(const string& str){
    cout << str << endl;
}

int main(){
    const char *c = "hello!";
    string str1 = c;
    test(str1);
    string str2 = "world";
    test(str2);
    string str3;
    str3 = 'a';
    test(str3);
    string str4;
    str4.assign(c);
    test(str4);
    string str5;
    str5.assign(c,1);
    string str6;
    str6.assign(c);
    test(str6);
    string str7;
    str7.assign(10,'s');
    test(str7);
    return 0;
}

4.string字符串拼接
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& operator+=(const string& str);//重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s,int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=(const string& str)
string& append(const string &s,int pos,int n);//字符串s中从pos开始的n个字符连接到字符串结尾
#include <iostream>

using namespace std;

int main(){
    string string1;
    const char *s = "hello";
    string1 += s;
    cout << string1 << endl;
    const char c = 'a';
    string1 += c;
    cout << string1 << endl;
    string str = "world";
    string1 += str;
    cout << string1 << endl;
    string1.append(s);
    cout << string1 << endl;
    string1.append(s,1);
    cout << string1 << endl;
    string1.append(str);
    cout << string1 << endl;
    string1.append(str,2,1);
    cout << string1 << endl;


    return 0;
}

/*
 *运行结果
hello
helloa
helloaworld
helloaworldhello
helloaworldhelloh
helloaworldhellohworld
helloaworldhellohworldr

 */
5.string字符串查找和替换
int find(const string& str,int pos =0)const;//查找str第一次出现位置,从pos开始查找
int find(const char*s,int pos =0)const;//查找s第一次出现位置,从pos开始查找
int find(const char* s,int pos,int n)const;//从pos位置查找s的前n个字符第一次位置
int find(const char c,int pos =0)const;//查找字符c第一次出现位置
int rfind(const string& str,int pos = npos)const;//查找str最后一次位置,从pos开始查找
int rfind(const char* s,int pos = npos)const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s,int pos,int n)const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c,int pos =0)const;//查找字符c最后一次出现位置
string& replace(int pos,int n, const string& str);//替换从pos开始n个字符为字符串str
string& replace(int pos,int n,const char* s);//替换从pos开始的n个字符为字符串s


int main(){
    string string1;
    string1 = "hello world!";
    const char *s = "he";
    cout <<  string1.find("ll",0) << endl;
    cout << string1.find(s,0) << endl;
    cout << string1.find(s,0,1) << endl;
    cout << string1.find('o') << endl;
    cout << string1.rfind("ll") << endl;
    cout << string1.rfind(s) << endl;
    cout << string1.rfind(s,0,1) << endl;
    cout << string1.rfind('o') << endl;
    string str = "china";
    string1.replace(0,5,str);
    cout << string1 << endl;
    string1.replace(0,2,s);
    cout << string1 << endl;

    return 0;
}

6.string字符串比较
int compare(const string &s) const;//与字符串s进行比较  返回几个字符不相等
int compare(const char *s) const //与字符串s进行比较 返回不相等的数量
#include <iostream>
using namespace std;

int main(){
    string str = "hello w";
    const char *s = "hello";
    string str1 = "hello";
    cout << -str1.compare(str) << endl;
    cout << str1.compare(s) << endl;
    return 0;
}
7.string字符存取
char& operator[](int n) 通过[]方式获取字符
char& at(int n); 通过at方法获取字符
#include <iostream>

using namespace std;

int main(){
    string str = "hello!";
    for(char i : str){
        cout << i << " ";
    }
    for (int i = 0; i < str.length(); ++i) {
        cout << str.at(i) << " ";
    }

    return 0;
}
8.string字符串插入和删除
* string& insert(int pos, const char* s); 插入字符串
* string& insert(int pos,const string& str);同上
* string& insert(int pos,int n, char c); 在pos位置插入n个字符c
* string& erase(int pos,int n= npos); 删除从pos开始的n个字符
#include <iostream>
using namespace std;

int main(){
    string str;
    const char *s = "hello";
    cout << str.insert(0,s) << endl;
    cout << str.insert(5," world") << endl;
    cout << str.insert(11,1,'a') << endl;
    cout << str.erase(0,2);
    return 0;
}
9.string字串获取
* string substr(int pos=0int n=npos)const; //返回由pos开始的n个字符组成的字符串
#include <iostream>
using namespace std;

int main(){

    string str = "hello!";
    cout << str.substr(4,1) << endl;
    str = "893754922@qq.com";
    cout << str.substr(0,str.find('@')) << endl;

    return 0;
}