STL::string简单介绍

news/2024/11/9 16:45:08/

目录

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/news/1435086.html

相关文章

拉索回归(Lasso)算法原理讲解

拉索回归&#xff08;Lasso Regression&#xff09;是机器学习中的一种线性回归方法&#xff0c;它在回归问题中加入了L1正则化项&#xff0c;有助于进行特征选择和模型稀疏化。下面是对拉索回归算法原理的讲解&#xff1a; 线性回归基础&#xff1a; 首先&#xff0c;我们先回…

稳态视觉诱发电位 (SSVEP) 分类学习系列 (1) :FFT-CNN-CCA

稳态视觉诱发电位分类学习系列:FFT-CNN-CCA 0. 引言1. 主要贡献2. 提出的方法2.1 数据处理2.2 卷积神经网络的结构 3. 结果3.1 健康参与者结果比较3.2 卒中患者结果比较 4. 总结欢迎来稿 论文地址&#xff1a;https://ieeexplore.ieee.org/document/8708243 论文题目&#xff1…

论基于架构的软件设计方法及应用

框架 一、 摘要 2020年12月,我参加了某省政协委员履职系统的开发。该系统为政协机关人员管理委员信息以及委员完成各项履职提供了全方位的软件支撑。我在该项目重担任系统架构师一职,负责履职系统的架构设计。本文结合作者的实践,以委员履职系统为例,论述基于架构的软件开…

可见性检测-unity掌握常见的可见性检测算法实现原理

Unity中的可见性检测算法是用来确定物体是否在相机的视野范围内&#xff0c;以便进行相应的渲染和优化。其中&#xff0c;最常用的可见性检测算法有两种&#xff1a;Frustum Culling&#xff08;视锥体剔除&#xff09;和Occlusion Culling&#xff08;遮挡剔除&#xff09;。 …

深入探究音视频开源库WebRTC中NetEQ音频抗网络延时与抗丢包的实现机制

目录 1、引言 2、WebRTC简介 3、什么是NetEQ&#xff1f; 4、NetEQ技术详解 4.1、NetEQ概述 4.2、抖动消除技术 4.3、丢包补偿技术 4.4、NetEQ概要设计 4.5、NetEQ的命令机制 4.6、NetEQ的播放机制 4.7、MCU的控制机制 4.8、DSP的算法处理 4.9、DSP算法的模拟测试…

Spring boot + MyBatis-Plus3

学习 增删改查 在 service 层直接调用。 insert(user) 增selectById(1) 根据id查updateById(user) 更新selectByMap(map) 根据条件查selectBatchIds(list) 根据多个id查selectPage(page, null) 分页查deleteById(1) 删除id为1的用户deleteByMap(map) 删除符合条件的用户d…

VS使用技巧

VS使用技巧 1、展开和缩进代码2、代码注释和取消注释 1、展开和缩进代码 缩进&#xff1a;ctrlmo 展开&#xff1a;ctrlml 2、代码注释和取消注释 注释&#xff1a;ctrlkc 取消注释&#xff1a;ctrlku

HFSS端口介绍1---集总端口

HFSS中可以设定多种激励端口,但在射频和SI领域使用集总端口(Lumped Port)和波端口(Wave Port)比较多,今天我们主要介绍集总端口。下面是HFSS仿真流程和端口设定说明。 端口定义 端口在电磁仿真中非常重要,它提供3维电磁场求解时的激励,进而求解S参数等信息,这相当于我们平…