STL::string简单介绍

server/2024/10/18 12:20:46/

目录

1、什么是STL

STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器

推荐文档(必须学会看文档)

2、string常用接口

 a、初始化


1、什么是STL


标准模板库 STL(Standard Template Library),主要是数据结构和算法的框架,是模板库的一部分,STL是一个规范,是一个实现要求,但是并没有要求实现细节.

STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器

推荐文档(必须学会看文档)

string - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/?kw=string

2、string常用接口

 a、初始化

哎呀,这部分,再写一遍很没有必要,所以就不写了。毕竟文档介绍的已经足够清晰,不会就查看文档,单词不会就查。主要的是要懂得底层的实现,懂得底层实现的细节,就能够更好的使用。而不仅仅只是一个接口工程师。
string - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/?kw=string

string提供的接口非常多,也很冗余。但是不影响,只要用主要的几个就好。

返回值不同不构成函数重载

3、string底层简单实现

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;namespace bit
{class string{friend ostream& operator<<(ostream& _cout, const bit::string& s);friend istream& operator>>(istream& _cin, bit::string& s);public:typedef char* iterator;typedef const char* const_iterator;public:void swap( string& s){std::swap(_str,s._str);std::swap(_size,s._size);std::swap(_capacity,s._capacity);}//s1("xxx")string(const char* str = ""){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str,str);}//s2(s1)拷贝string(const string& s) {/* _size = s._size;_capacity = _size;_str = new char[_capacity + 1];strcpy(_str,s._str);*///这里的将s1交s2,同理,也可以直接使用swap交换//但是s是一个const,需要拷贝一份非conststring tmp(s._str);swap(tmp);}//s2 = s1string& operator=( string& s){/*_size = s._size;_str = new char[_size];strcpy(_str,s._str);_capacity = s._capacity;*/string tmp(s);swap(tmp);return  *this;}//析构~string(){delete[] _str;_size = _capacity = 0;}const  char* c_str()const{return _str;}//// iteratoriterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}const  char& operator[]( size_t pos)const{assert(pos < _size);return _str[pos];}char& operator[]( size_t pos){assert(pos < _size);return _str[pos];}///modifystring& push_back(char c){/*  if (_size == _capacity ){char* tmp = new char[_capacity = _capacity == 0 ? 4 : _capacity * 2];}_str[_size] = c;++_size;*/insert(_size,c);return *this;}string& operator+=(char c){insert(_size,c);return *this;}string& operator+=(const char* str){insert(_size, str);return *this;}string& append(const char* str){insert(_size,str);return *this;}void clear(){delete[] _str;_capacity = _size = 0;_str = nullptr;}///// capacitysize_t size()const{return _size;}size_t capacity()const{return _capacity;}bool empty()const{return _size == 0;}void resize(size_t n, char ch = '\0'){if (n <= _size){_str[n] = '\0';_size = n;}else{reserve(n);for (size_t i =_size;i<n;++i){_str[i] = ch;}_str[n] = '\0';_size = n;}}void reserve(size_t n){if (n > _capacity ){char* tmp = new char[n + 1];strcpy(tmp,_str);delete[] _str;_str = tmp;_capacity = n;}}/// 返回c在string中第一次出现的位置size_t find(char c) const{size_t  i = 0;while (i < _size){if (_str[i] == c){return i;}++i;}}// 返回子串s在string中第一次出现的位置size_t find(const char* s) const{char* cur = strstr(this->_str,s);size_t len = cur - _str;return len;}// 在pos位置上插入字符c/字符串str,并返回该字符的位置size_t insert(size_t pos, char c){assert(pos <= _size );if (_size <=  _capacity ){//char* tmp = new char[_capacity == 0 ? 4 : _capacity * 2];//扩容两倍reserve(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + 1;//把\0也往后移动while(end > pos)//当end到pos下一个位置,正好把pos位置往后移动{_str[end] = _str[end - 1];--end;}_str[pos] = c;_size++;return pos;}void insert(size_t pos, const char* str){assert(pos <= _size);if (strlen(str ) + _size > _capacity){reserve(_size + strlen(str));}//往后移动len位置,插入strsize_t len = strlen(str);size_t end = len + _size;while (end >= pos + len ){_str[end] = _str[end - len];--end;}//不能把\0粘贴进来strncpy(_str + pos, str,len);_size += len;}// 删除pos位置上的元素,并返回该元素的下一个位置size_t erase(size_t pos, size_t len  = 1){assert(pos < _size);//删除pos位置以后的值//如果n等于超过size,删完,不管//小于,往前挪动覆盖即可if ( len  >= _size - pos ){_str[len] = '\0';_size = pos;}else{//从pos位置开始,往后len个位置,往前覆盖strcpy(_str + pos, _str + pos + len);_size -= len;}return pos + 1;}void print(){for (auto e : *this){cout << e ;}cout << endl;}public:static const int npos;//声明private:char* _str;size_t _capacity;size_t _size;};//创建const int string::npos = -1;//relational operators直接利用strcmp函数返回值,而不是自己遍历对比bool operator<(const string& s1, const string& s2){int ret =  strcmp(s1.c_str(), s2.c_str()) ;return ret < 0;}bool operator>(const string& s1, const string& s2){int ret = strcmp(s1.c_str(), s2.c_str());return ret > 0;}bool operator<=(const string& s1, const string& s2){return !(s1 > s2);}bool operator>=(const string& s1, const string& s2){return !(s1 < s2);}bool operator==(const string& s1, const string& s2){int ret =  strcmp(s1.c_str(), s2.c_str()) ;return ret == 0;}bool operator!=(const string& s1, const string& s2){return !(s1 == s2);}ostream& operator<<(ostream& _cout, const bit::string& s){for (size_t  i = 0; i < s.size();++i){_cout << s.c_str()[i];}return _cout;}istream& operator>>(istream& _cin, bit::string& s){for (size_t i = 0; i<s.size();++i){_cin >> s._str[i];}return _cin;}void test1(){string s0;string s1("hello world");const string s2("hello Linux");s0 = s1;const  string s3 = s2;for (auto e : s3){cout << e;}cout << endl;}void test2(){string s("hello world");s.reserve(5);cout << s.capacity() << endl;;s.reserve(20);cout << s.capacity() << endl;s.print();}void test3(){string s("hello world");//s.resize(5);//s.print();//cout << s.size() << endl;s.resize(30,'x');s.print();cout << s.size() << endl;cout << s[29] << endl;}void test4(){string s1("abc");string s2("def");cout << (s1 == s2) << endl;cout << (s1 != s2) << endl;cout << (s1>s2) << endl;cout << (s1 <= s2) << endl;cout << (s1 >= s2) << endl;}void test5(){string s1("abcxxxxxxxxxxxxxxxxxxxxx");s1.erase(1,100);// s1.erase(1);s1.print();}void test6(){string s("hello world");//s.insert(11,"xxxxx");s.insert(11,"abbbb");cout << s.capacity() << endl;cout << s.size() << endl;s.print();}void test7(){string s1("aaabbbccc");//size_t add = s1.find('b');size_t add = s1.find("ccc");cout << add << endl;}void test8(){string s("hello world");s.push_back('a');s.append("xxxx");s += 'w';s += "oooooo";//cout << s << endl;s.print();}void test9 (){//string s("hello world ");//cout << s;string s1;//int a;//cin >> a;//cout << a;//"hello" >> s1.c_str;cout<<s1;}};


http://www.ppmy.cn/server/14170.html

相关文章

ik分词器是什么,有那些配置? ik_smart和ik_max_word的两个分词算法有何区别?

1、ik分词器是什么&#xff0c;有那些配置&#xff1f; 1、ik分词器是什么&#xff1f; IK分词器是一种基于正向匹配的分词算法&#xff0c;它是中文自然语言处理中的一个基本环节。在搜索时&#xff0c;IK分词器会把用户的信息以及数据库或索引库中的数据进行分词&#xff0…

变频器基础原理

文章目录 0. 基本知识1.三相的电压之和为02.正弦交流相量的相量表示法(相量只是表示正弦量&#xff0c;而不等于正弦量 &#xff1b;只有正弦量才能用相量表示)引入相量表示法目的:一种正弦量的产生方式:正弦量的相量表示&#xff0c;使用欧拉公式表示复数 3.用复数表示正弦量&…

Python构建学生信息管理系统:构建RESTful API - 学生信息管理系统的后端逻辑

在之前的博客里&#xff0c;我们已经完成了项目初始化&#xff0c;在本篇博客中&#xff0c;我们将深入探讨如何使用Flask框架实现学生信息管理系统的后端逻辑&#xff0c;特别是通过RESTful API来实现学生信息的增删改查&#xff08;CRUD&#xff09;操作。 Flask RESTful AP…

vue - 路由守卫

Vue路由守卫是一种机制&#xff0c;用于在导航过程中对路由进行监控和控制。Vue Router提供了三种类型的路由守卫&#xff1a; 1. 全局前置守卫&#xff1a;router.beforeEach 2. 全局解析守卫&#xff1a;router.beforeResolve 3. 全局后置守卫&#xff1a;router.afterEac…

CCF区块链会议--Middleware 2024 截止5.24 附录用率

会议名称&#xff1a;Middleware CCF等级&#xff1a;CCF B类会议 类别&#xff1a;软件工程/系统软件/程序设计语言 录用率&#xff1a;2022年录用率38%&#xff08;8/21&#xff09; Topics of Interest The Middleware conference seeks original submissions of resear…

数字信号处理操作教程_音频解码:3-8 G711A音频解码实验

一、实验目的 学习G711音频的格式和G711A音频解码的原理&#xff0c;并实现将BIT格式解码为PCM格式。 二、实验原理 G711 G711是国际电信联盟订定出来的一套语音压缩标准&#xff0c;主要用于电话。它主要用脉冲编码调制对音频采样&#xff0c;采样率为8k每秒。它利用一个 …

(六)JSP与Servlet的关系

JSP与Servlet的关系 JSP&#xff08;Java Server Pages&#xff09;是继Servlet后Sun公司推出的新技术。JSP技术在传统的HTML文件中插入Java程序段和JSP标记&#xff0c;从而形成JSP文件&#xff08;*.jsp&#xff09;。用JSP开发的Web应用是跨平台的&#xff0c;既能在Window…

mermaid 之 (Flowchart) 流程图

(Flowchart) 流程图是一种在Mermaid中常用的图形&#xff0c;用于描述一系列步骤和决策。以下是Mermaid中创建流程图的详细语法介绍&#xff1a; 前言 官网文档 基础语法 图的方向 graph TD&#xff1a;从上到下 (Top Down)graph LR&#xff1a;从左到右 (Left to Right)g…