【C++】第十节—string类(完结篇)——详解+代码示例

打印 上一主题 下一主题

主题 1608|帖子 1608|积分 4824

hello ,好久不见!
云边有个稻草人-个人主页
C++优质专栏!~接待订阅~

目录
一、string实现时要注意的细节点
1.void string::Insert(size_t pos, char ch)
2.void string::Insert(size_t pos, const char* str)
第一种方法
第二种方法
3.到底在哪里定义static const size_t npos ?
4.实现取域名
5.拷贝—拷贝构造和赋值
6.流插入
7.三个swap
二、
2.1 经典的string类题目
2.2 浅拷贝
2.3 深拷贝
(1)【传统版写法的String类】
(2)【现代版写法的String类】
(3)【写时拷贝】(了解)
(4)扩展阅读
(5)编码
三、综合代码
string.h
string.cpp
test.cpp

正文开始——

一、string实现时要注意的细节点

1.void string::Insert(size_t pos, char ch)


  1. void string::Insert(size_t pos, char ch)
  2. {
  3.         //对于任何的插入操作都要先判断空间是否充足提前预留足够的空间
  4.         if (_size == _capacity)
  5.         {
  6.                 reserve(_capacity == 0 ? 4 : 2 * _capacity);
  7.         }
  8.         size_t end = _size+1;
  9.         //预留出pos位置的空间进行插入操作
  10.         while (end > pos)
  11.         {
  12.                 _str[end] = _str[end - 1];
  13.                 --end;
  14.         }
  15.         _str[pos] = ch;
  16.         _size++;
  17. }
复制代码
2.void string::Insert(size_t pos, const char* str)

第一种方法

跟我们前面讲的很相似,使用强转来解决范例的题目
  1. void string::Insert(size_t pos, const char* str)
  2. {
  3.         //还是先扩容
  4.         size_t len = strlen(str);
  5.         if (_size + len > _capacity)
  6.         {
  7.                 //扩容
  8.                 size_t newCapacity = 2 * _capacity;
  9.                 //扩2倍不够直接需要多少扩多少
  10.                 if (newCapacity < _size + len)
  11.                         newCapacity = _size + len;
  12.                 reserve(newCapacity);
  13.         }
  14.         int end = _size;
  15.         while (end >= (int)pos)
  16.         {
  17.                 _str[end + len] = _str[end];
  18.                 end--;
  19.         }
  20.        
  21.         //将str进行挨个插入
  22.         for (size_t i = 0; i < len; i++)
  23.         {
  24.                 _str[pos + i] = str[i];
  25.         }
  26.         _size += len;
  27. }
复制代码
第二种方法

是将end-len移到end指向的数据

  1. void string::Insert(size_t pos, const char* str)
  2. {
  3.         //还是先扩容
  4.         size_t len = strlen(str);
  5.         if (_size + len > _capacity)
  6.         {
  7.                 //扩容
  8.                 size_t newCapacity = 2 * _capacity;
  9.                 //扩2倍不够直接需要多少扩多少
  10.                 if (newCapacity < _size + len)
  11.                         newCapacity = _size + len;
  12.                 reserve(newCapacity);
  13.         }
  14.         size_t end = _size + len;
  15.         while (end >= pos+len)   //end-len==pos,end==pos+len,
  16.         {
  17.                 _str[end] = _str[end-len];
  18.                 end--;
  19.         }
  20.         //将str进行挨个插入
  21.         for (size_t i = 0; i < len; i++)
  22.         {
  23.                 _str[pos + i] = str[i];
  24.         }
  25.         _size += len;
  26. }
复制代码
3.到底在哪里定义static const size_t npos ?

(1)所有的.c或者.cpp文件在编译链接的时候都会生成.o文件(VS下叫.obj文件),.h文件在预处理的时候就在两个.cpp文件里面展开了,我们在类域外面定义的npos就会在两个.cpp里面展开,当两个.cpp文件链接合并生成可执行步伐的时候,就构成了下面报错里面的重定义,以是当静态成员变量定义和声明分离的时候要在.cpp文件里面定义,不能像以前那样在类里面声明在类外面定义。对于npos要加上const,不可修改。(2)同时npos要在定义的时候给值,对于const对象是只有定义时一次初始化的时机。(3)特殊的一点,对于静态的const(只有整型范例的数据才可以的,这算是一个特殊处理)成员变量可以在声明的时候给缺省值,那么在定义的时候就不可以再给值了。


总结一下,对于这种环境有两种解决办法



4.实现取域名


  1. //取域名
  2. void test_string4()
  3. {
  4.         lrq::string s1 = "https://mpbeta.csdn.net/mp_blog/creation/editor/147116669?spm=1000.2115.3001.4503";
  5.         size_t pos1 = s1.find(':');
  6.         size_t pos2 = s1.find('/', pos1 + 3);
  7.         //判断是否找到目标字符
  8.         if (pos1 != string::npos && pos2 != string::npos)//npos受类域影响
  9.         {
  10.                 lrq::string domain = s1.substr(pos1 + 3, pos2 - (pos1 + 3));//注意pos1和pos2到底指向哪些个位置
  11.                 cout << domain.c_str() << endl;
  12.         }
  13. }
复制代码
5.拷贝—拷贝构造和赋值


我们不表现写拷贝构造和赋值拷贝(都是一种赋值行为),编译器默认都会举行浅拷贝。(1)像上面的代码将s1拷贝赋值给s2,编译器默认的浅拷贝会导致s2和s1指向同一块空间,函数结束的时候会先析构s2再析构s1导致同一块空间析构两次就会出现上面的运行瓦解;(2)还会导致内存走漏,s2之前的空间没有得到释放。(如果一个类需要表现写析构,那么一样平常就需要写拷贝构造和赋值)

  1. //s1 = s3
  2. string& string::operator=(const string& s)
  3. {
  4.         if (this != &s)
  5.         {
  6.                 //上来先将s1给释放掉
  7.                 delete[] _str;
  8.                 _str = new char[s._capacity + 1];//预留一个\0的空间
  9.                 strcpy(_str, s._str);
  10.                 _size = s._size;
  11.                 _capacity = s._capacity;
  12.         }
  13.         return *this;
  14. }
复制代码
6.流插入

我们输入的是abcd efg,中间包罗一个空格字符,但是ch好像并没有从缓冲区里面提取到空格,看下图,记着,cin在直接使用流提取的时候无论输入任何范例,int,char,它都会默认忽略掉空格和换行,规定以为空格和换行都是多个值之间的分割,也就无法判定什么时候结束,以是我们要举行代码的修改。

我们使用istream类里面的get,可以提取到空格和换行


  1. //cin>>str,这个实现的功能和前面讲的getline很像,只不过结束字符不同而已,我们要融会贯通一下
  2. istream& operator>>(istream& is, string& str)
  3. {
  4.         str.clear();//清空str里面原来的字符,否则会继续加在str上面,这是实现和STL里面的string::>>一样的效果
  5.         char ch;
  6.         ch = is.get();
  7.         while (ch != ' ' && ch != '\n')
  8.         {
  9.                 str += ch;
  10.                 ch = is.get();
  11.         }
  12.         return is;
  13. }
复制代码
优化一下: 
  1. istream& operator>>(istream& is, string& str)
  2.         {
  3.                 str.clear();
  4.                 int i = 0;
  5.                 char buff[256];
  6.                 char ch;
  7.                 ch = is.get();
  8.                 while (ch != ' ' && ch != '\n')
  9.                 {
  10.                         // 放到buff
  11.                         buff[i++] = ch;
  12.                         if (i == 255)
  13.                         {
  14.                                 buff[i] = '\0';
  15.                                 str += buff;
  16.                                 i = 0;
  17.                         }
  18.                         ch = is.get();
  19.                 }
  20.                 if (i > 0)
  21.                 {
  22.                         buff[i] = '\0';
  23.                         str += buff;
  24.                 }
  25.                 return is;
  26.         }
复制代码
7.三个swap




二、

2.1 经典的string类题目

   上面已经对  string  类举行了简单的介绍,各人只要可以或许正常使用即可。在面试中,面试官总喜好让学生自己来模拟实现string  类,最重要是实现  string  类的构造、拷贝构造、赋值运算符重载以及析构函数。各人看下以下string  类的实现是否有题目?
  1. // 为了和标准库区分,此处使用String
  2. class String
  3. {
  4. public:
  5.         /*String()
  6.         :_str(new char[1])
  7.         {*_str = '\0';}
  8.         */
  9.         //String(const char* str = "\0") 错误示范
  10.         //String(const char* str = nullptr) 错误示范
  11.         String(const char* str = "")
  12.         {
  13.                 // 构造String类对象时,如果传递nullptr指针,可以认为程序非
  14.                 if (nullptr == str)
  15.                 {
  16.                         assert(false);
  17.                         return;
  18.                 }
  19.                 _str = new char[strlen(str) + 1];
  20.                 strcpy(_str, str);
  21.         }
  22.         ~String()
  23.         {
  24.                 if (_str)
  25.                 {
  26.                         delete[] _str;
  27.                         _str = nullptr;
  28.                 }
  29.         }
  30. private:
  31.         char* _str;
  32. };
  33. // 测试
  34. void TestString()
  35. {
  36.         String s1("hello bit!!!");
  37.         String s2(s1);
  38. }
复制代码

   说明:上述  String  类没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认  的,当用  s1  构造  s2  时,编译器会调用默认的拷贝构造。最终导致的题目是,  s1    s2  共用同一块内  存空间,在释放时同一块空间被释放多次而引起步伐瓦解  ,这种拷贝方式,称为浅拷贝。   2.2 浅拷贝


   浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来  。如果  对象中管理资源  ,末了就会  导致  多个对象共享同一份资源,当一个对象烧毁时就会将该资源释放掉,而此时另一些对象不知道该  资源已经被释放,以为尚有效,以是当继续对资源进项操作时,就会发生发生了访问违规  。就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。    可以接纳深拷贝解决浅拷贝题目,即:  每个对象都有一份独立的资源,不要和其他对象共享  。父母给每个孩子都买一份玩具,各自玩各自的就不会有题目了。   2.3 深拷贝

   如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一样平常环境都是按照深拷贝方式提供。  


(1)【传统版写法的String

  1. class String
  2. {
  3. public:
  4.         String(const char* str = "")
  5.         {
  6.                 // 构造String类对象时,如果传递nullptr指针,可以认为程序非
  7.                 if (nullptr == str)
  8.                 {
  9.                         assert(false);
  10.                         return;
  11.                 }
  12.                 _str = new char[strlen(str) + 1];
  13.                 strcpy(_str, str);
  14.         }
  15.         String(const String& s)
  16.                 : _str(new char[strlen(s._str) + 1])
  17.         {
  18.                 strcpy(_str, s._str);
  19.         }
  20.         String& operator=(const String& s)
  21.         {
  22.                 if (this != &s)
  23.                 {
  24.                         char* pStr = new char[strlen(s._str) + 1];
  25.                         strcpy(pStr, s._str);
  26.                         delete[] _str;
  27.                         _str = pStr;
  28.                 }
  29.                 return *this;
  30.         }
  31.         ~String()
  32.         {
  33.                 if (_str)
  34.                 {
  35.                                 delete[] _str;
  36.                         _str = nullptr;
  37.                 }
  38.         }
  39. private:
  40.         char* _str;
  41. };
复制代码
(2)【现代版写法的String


  1. class String
  2. {
  3. public:
  4.         String(const char* str = "")
  5.         {
  6.                 if (nullptr == str)
  7.                 {
  8.                         assert(false);
  9.                         return;
  10.                 }
  11.                 _str = new char[strlen(str) + 1];
  12.                 strcpy(_str, str);
  13.         }
  14.         String(const String& s)
  15.                 : _str(nullptr)
  16.         {
  17.                 String strTmp(s._str);
  18.                 swap(_str, strTmp._str);
  19.         }
  20.         // 对比下和上面的赋值那个实现比较好?
  21.         String& operator=(String s)
  22.         {
  23.                 swap(_str, s._str);
  24.                 return *this;
  25.         }
  26.         /*
  27.         String& operator=(const String& s)
  28.         {
  29.         if(this != &s)
  30.         {
  31.         String strTmp(s);
  32.         swap(_str, strTmp._str);
  33.         }
  34.         return *this;
  35.         }
  36.         */
  37.         ~String()
  38.         {
  39.                 if (_str)
  40.                 {
  41.                         delete[] _str;
  42.                         _str = nullptr;
  43.                 }
  44.         }
  45. private:
  46.         char* _str;
  47. };
复制代码
(3)【写时拷贝】(了解)


   写时拷贝就是一种拖延症,是在浅拷贝的底子之上增加了引用计数的方式来实现的。     引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成  1  ,每增加一个对象使用该资源,就给计数增加1  ,当某个对象被烧毁时,先给该计数减  1  ,然后再检查是否需要释放资源,如果计数为1  ,说明该对象时资源的末了一个使用者,将该资源释放;否则就不能释放,因为尚有其他对象在使用该资源。        写时拷贝       写时拷贝在读取时的缺陷    (4)扩展阅读

   面试中string的一种精确写法
  STL 的string类怎么啦?
  (5)编码


三、综合代码

string.h

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #pragma once
  3. #include<iostream>
  4. #include<assert.h>
  5. using namespace std;
  6. namespace bit
  7. {
  8.         class string
  9.         {
  10.         public:
  11.                 //typedef char* iterator;
  12.                 using iterator = char*;
  13.                 using const_iterator = const char*;
  14.                 //string();
  15.                 string(const char* str = "");
  16.                 string(const string& s);
  17.                 string& operator=(string s);
  18.                 ~string();
  19.                 void reserve(size_t n);
  20.                 void push_back(char ch);
  21.                 void append(const char* str);
  22.                 string& operator+=(char ch);
  23.                 string& operator+=(const char* str);
  24.                 void insert(size_t pos, char ch);
  25.                 void insert(size_t pos, const char* str);
  26.                 void erase(size_t pos, size_t len = npos);
  27.                 size_t find(char ch, size_t pos = 0);
  28.                 size_t find(const char* str, size_t pos = 0);
  29.                 char& operator[](size_t i)
  30.                 {
  31.                         assert(i < _size);
  32.                         return _str[i];
  33.                 }
  34.                 const char& operator[](size_t i) const
  35.                 {
  36.                         assert(i < _size);
  37.                         return _str[i];
  38.                 }
  39.                 iterator begin()
  40.                 {
  41.                         return _str;
  42.                 }
  43.                 iterator end()
  44.                 {
  45.                         return _str+_size;
  46.                 }
  47.                 const_iterator begin() const
  48.                 {
  49.                         return _str;
  50.                 }
  51.                 const_iterator end() const
  52.                 {
  53.                         return _str + _size;
  54.                 }
  55.                 size_t size() const
  56.                 {
  57.                         return _size;
  58.                 }
  59.                 const char* c_str() const
  60.                 {
  61.                         return _str;
  62.                 }
  63.                 void clear()
  64.                 {
  65.                         _str[0] = '\0';
  66.                         _size = 0;
  67.                 }
  68.                 void swap(string& s);
  69.                 string substr(size_t pos, size_t len = npos);
  70.         private:
  71.                 char* _str = nullptr;
  72.                 size_t _size = 0;
  73.                 size_t _capacity = 0;
  74.         public:
  75.                 // ⴦
  76.                 //static const size_t npos = -1;
  77.                 static const size_t npos;
  78.         };
  79.         void swap(string& s1, string& s2);
  80.         bool operator== (const string& lhs, const string& rhs);
  81.         bool operator!= (const string& lhs, const string& rhs);
  82.         bool operator> (const string& lhs, const string& rhs);
  83.         bool operator< (const string& lhs, const string& rhs);
  84.         bool operator>= (const string& lhs, const string& rhs);
  85.         bool operator<= (const string& lhs, const string& rhs);
  86.         ostream& operator<<(ostream& os, const string& str);
  87.         istream& operator>>(istream& is, string& str);
  88.         istream& operator>>(istream& is, string& str);
  89.         istream& getline(istream& is, string& str, char delim = '\n');
  90. }
复制代码
string.cpp

  1. #include"string.h"namespace bit{        const size_t string::npos = -1;        // 11:52        /*string::string()                :_str(new char[1]{ '\0' })                , _size(0)                , _capacity(0)        {}*/        string::string(const char* str)                :_size(strlen(str))        {                _capacity = _size;                _str = new char[_size + 1];                strcpy(_str, str);        }        // 传统写法        // s2(s1)        /*string::string(const string& s)        {                _str = new char[s._capacity + 1];                strcpy(_str, s._str);                _size = s._size;                _capacity = s._capacity;        }*/        // s2(s1)        // 现代写法        string::string(const string& s)        {                string tmp(s._str);                swap(tmp);        }        // s2 = s1 = s3        // s1 = s1;        // 传统写法        /*string& string::operator=(const string& s)        {                if (this != &s)                {                        delete[] _str;                        _str = new char[s._capacity + 1];                        strcpy(_str, s._str);                        _size = s._size;                        _capacity = s._capacity;                }                return *this;        }*/        // 现代写法        // s1 = s3        string& string::operator=(string s)        {                swap(s);                return *this;        }        string::~string()        {                delete[] _str;                _str = nullptr;                _size = 0;                _capacity = 0;        }        void string::reserve(size_t n)        {                if (n > _capacity)                {                        //cout << "reserve:" << n << endl;                        char* tmp = new char[n + 1];                        strcpy(tmp, _str);                        delete[] _str;                        _str = tmp;                        _capacity = n;                }        }        void string::push_back(char ch)        {                /*if (_size == _capacity)                {                        reserve(_capacity == 0 ? 4 : _capacity * 2);                }                _str[_size] = ch;                _size++;*/                insert(_size, ch);        }        void string::append(const char* str)        {                //size_t len = strlen(str);                //if (_size + len > _capacity)                //{                //        size_t newCapacity = 2 * _capacity;                //        // 扩2倍不够,则需要多少扩多少                //        if (newCapacity < _size + len)                //                newCapacity = _size + len;                //        reserve(newCapacity);                //}                //strcpy(_str + _size, str);                //_size += len;                insert(_size, str);        }        string& string::operator+=(char ch)        {                push_back(ch);                return *this;        }        string& string::operator+=(const char* str)        {                append(str);                return *this;        }        void string::insert(size_t pos, char ch)        {                assert(pos <= _size);                if (_size == _capacity)                {                        reserve(_capacity == 0 ? 4 : _capacity * 2);                }                /*int end = _size;                while (end >= (int)pos)                {                        _str[end + 1] = _str[end];                        --end;                }*/                size_t end = _size + 1;                while (end > pos)                {                        _str[end] = _str[end - 1];                        --end;                }                _str[pos] = ch;                _size++;        }        void string::insert(size_t pos, const char* str)        {                assert(pos <= _size);                size_t len = strlen(str);                if (_size + len > _capacity)                {                        size_t newCapacity = 2 * _capacity;                        // 扩2倍不够,则需要多少扩多少                        if (newCapacity < _size + len)                                newCapacity = _size + len;                        reserve(newCapacity);                }                /*int end = _size;                while (end >= (int)pos)                {                        _str[end + len] = _str[end];                        --end;                }*/                size_t end = _size + len;                while (end > pos + len - 1)                {                        _str[end] = _str[end - len];                        --end;                }                for (size_t i = 0; i < len; i++)                {                        _str[pos + i] = str[i];                }                _size += len;        }        void string::erase(size_t pos, size_t len)        {                assert(pos < _size);                if (len >= _size - pos)                {                        _str[pos] = '\0';                        _size = pos;                }                else                {                        // 从后往前挪                        size_t end = pos + len;                        while (end <= _size)                        {                                _str[end - len] = _str[end];                                ++end;                        }                        _size -= len;                }        }        size_t string::find(char ch, size_t pos)        {                assert(pos < _size);                for (size_t i = pos; i < _size; i++)                {                        if (ch == _str[i])                                return i;                }                return npos;        }        size_t string::find(const char* str, size_t pos)        {                assert(pos < _size);                const char* ptr = strstr(_str + pos, str);                if (ptr == nullptr)                {                        return npos;                }                else                {                        return ptr - _str;                }        }        string string::substr(size_t pos, size_t len)        {                assert(pos < _size);                // 大于后面剩余串的长度,则直接取到结尾                if (len > (_size - pos))                {                        len = _size - pos;                }                bit::string sub;                sub.reserve(len);                for (size_t i = 0; i < len; i++)                {                        sub += _str[pos + i];                }                //cout << sub.c_str() << endl;                return sub;        }        void string::swap(string& s)        {                std::swap(_str, s._str);                std::swap(_size, s._size);                std::swap(_capacity, s._capacity);        }                void swap(string& s1, string& s2)        {                s1.swap(s2);        }        bool operator== (const string& lhs, const string& rhs)        {                return strcmp(lhs.c_str(), rhs.c_str()) == 0;        }        bool operator!= (const string& lhs, const string& rhs)        {                return !(lhs == rhs);        }        bool operator> (const string& lhs, const string& rhs)        {                return !(lhs <= rhs);        }        bool operator< (const string& lhs, const string& rhs)        {                return strcmp(lhs.c_str(), rhs.c_str()) < 0;        }        bool operator>= (const string& lhs, const string& rhs)        {                return !(lhs < rhs);        }        bool operator<= (const string& lhs, const string& rhs)        {                return lhs < rhs || lhs == rhs;        }        ostream& operator<<(ostream& os, const string& str)        {                //os<<'"';                //os << "xx"xx";                for (size_t i = 0; i < str.size(); i++)                {                        //os << str[i];                        os << str[i];                }                //os << '"';                return os;        }        istream& operator>>(istream& is, string& str)
  2.         {
  3.                 str.clear();
  4.                 int i = 0;
  5.                 char buff[256];
  6.                 char ch;
  7.                 ch = is.get();
  8.                 while (ch != ' ' && ch != '\n')
  9.                 {
  10.                         // 放到buff
  11.                         buff[i++] = ch;
  12.                         if (i == 255)
  13.                         {
  14.                                 buff[i] = '\0';
  15.                                 str += buff;
  16.                                 i = 0;
  17.                         }
  18.                         ch = is.get();
  19.                 }
  20.                 if (i > 0)
  21.                 {
  22.                         buff[i] = '\0';
  23.                         str += buff;
  24.                 }
  25.                 return is;
  26.         }        istream& getline(istream& is, string& str, char delim)        {                str.clear();                int i = 0;                char buff[256];                char ch;                ch = is.get();                while (ch != delim)                {                        // 放到buff                        buff[i++] = ch;                        if (i == 255)                        {                                buff[i] = '\0';                                str += buff;                                i = 0;                        }                        ch = is.get();                }                if (i > 0)                {                        buff[i] = '\0';                        str += buff;                }                return is;        }}
复制代码
test.cpp

  1. #include"string.h"
  2. void test_string1()
  3. {
  4.         bit::string s2;
  5.         cout << s2.c_str() << endl;
  6.         bit::string s1("hello world");
  7.         cout << s1.c_str() << endl;
  8.         s1[0] = 'x';
  9.         cout << s1.c_str() << endl;
  10.         for (size_t i = 0; i < s1.size(); i++)
  11.         {
  12.                 cout << s1[i] << " ";
  13.         }
  14.         cout << endl;
  15.         // 迭代器 -- 像指针一样的对象
  16.         bit::string::iterator it1 = s1.begin();
  17.         while (it1 != s1.end())
  18.         {
  19.                 (*it1)--;
  20.                 ++it1;
  21.         }
  22.         cout << endl;
  23.         it1 = s1.begin();
  24.         while (it1 != s1.end())
  25.         {
  26.                 cout << *it1 << " ";
  27.                 ++it1;
  28.         }
  29.         cout << endl;
  30.         // 修改
  31.         // 底层是迭代器的支持
  32.         // 意味着支持迭代器就支持范围for
  33.         for (auto& ch : s1)
  34.         {
  35.                 ch++;
  36.         }
  37.         for (auto ch : s1)
  38.         {
  39.                 cout << ch << " ";
  40.         }
  41.         cout << endl;
  42.         const bit::string s3("xxxxxxxxx");
  43.         for (auto& ch : s3)
  44.         {
  45.                 //ch++;
  46.                 cout << ch << " ";
  47.         }
  48.         cout << endl;
  49. }
  50. void test_string2()
  51. {
  52.         bit::string s1("hello world");
  53.         cout << s1.c_str() << endl;
  54.         s1 += '#';
  55.         s1 += "#hello world";
  56.         cout << s1.c_str() << endl;
  57.         bit::string s2("hello world");
  58.         cout << s2.c_str() << endl;
  59.         s2.insert(6, 'x');
  60.         cout << s2.c_str() << endl;
  61.         s2.insert(0, 'x');
  62.         cout << s2.c_str() << endl;
  63.         bit::string s3("hello world");
  64.         cout << s3.c_str() << endl;
  65.         s3.insert(6, "xxx");
  66.         cout << s3.c_str() << endl;
  67.         s3.insert(0, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
  68.         cout << s3.c_str() << endl;
  69. }
  70. void test_string3()
  71. {
  72.         bit::string s1("hello world");
  73.         cout << s1.c_str() << endl;
  74.         s1.erase(6, 2);
  75.         cout << s1.c_str() << endl;
  76.         s1.erase(5, 20);
  77.         cout << s1.c_str() << endl;
  78.         s1.erase(3);
  79.         cout << s1.c_str() << endl;
  80. }
  81. void test_string4()
  82. {
  83.         bit::string s1("hello world");
  84.         cout << s1.find(' ') << endl;
  85.         cout << s1.find("wo") << endl;
  86.         bit::string s2 = "https://legacy.cplusplus.com/reference/cstring/strstr/?kw=strstr";
  87.         //bit::string s2 = "https://blog.csdn.net/ww753951/article/details/130427526";
  88.         size_t pos1 = s2.find(':');
  89.         size_t pos2 = s2.find('/', pos1+3);
  90.         if (pos1 != string::npos && pos2 != string::npos)
  91.         {
  92.                 bit::string domain = s2.substr(pos1 + 3, pos2 - (pos1 + 3));
  93.                 cout << domain.c_str() << endl;
  94.                 bit::string uri = s2.substr(pos2+1);
  95.                 cout << uri.c_str() << endl;
  96.         }
  97. }
  98. void test_string5()
  99. {
  100.         bit::string s1("hello world");
  101.         bit::string s2(s1);
  102.         cout << s1.c_str() << endl;
  103.         cout << s2.c_str() << endl;
  104.         s1[0] = 'x';
  105.         cout << s1.c_str() << endl;
  106.         cout << s2.c_str() << endl;
  107.         bit::string s3("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
  108.         s1 = s3;
  109.         cout << s1.c_str() << endl;
  110.         cout << s3.c_str() << endl;
  111.         s1 = s1;
  112.         cout << s1.c_str() << endl;
  113. }
  114. void test_string6()
  115. {
  116.         //bit::string s1("hello world");
  117.         //bit::string s2(s1);
  118.         //bit::string s3 = s1;
  119.          构造+拷贝 ->优化直接构造
  120.         //bit::string s4 = "hello world";
  121.         //cout << (s1 == s2) << endl;
  122.         //cout << (s1 < s2) << endl;
  123.         //cout << (s1 > s2) << endl;
  124.         //cout << (s1 == "hello world") << endl;
  125.         //cout << ("hello world" == s1) << endl;
  126.         operator<<(cout, s1);
  127.         //cout << s1 << endl;
  128.         //cin >> s1;
  129.         //cout << s1 << endl;
  130.         //
  131.         //std::string ss1("hello world");
  132.         //cin >> ss1;
  133.         //cout << ss1 << endl;
  134.         bit::string s1;
  135.         //cin >> s1;
  136.         //cout << s1 << endl;
  137.         getline(cin, s1);
  138.         cout << s1 << endl;
  139.         getline(cin, s1, '#');
  140.         cout << s1 << endl;
  141. }
  142. //void test_string7()
  143. //{
  144. //        bit::string s1("hello world");
  145. //        bit::string s2("xxxxxxxxxxxxxxxxxxxxxxx");
  146. //
  147. //        //swap(s1, s2);
  148. //        s1.swap(s2);
  149. //        cout << s1 << endl;
  150. //        cout << s2 << endl;
  151. //}
  152. void test_string8()
  153. {
  154.         bit::string s1("hello world");
  155.         bit::string s2(s1);
  156.         bit::string s3("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
  157.         s1 = s3;
  158.         cout << s1 << endl;
  159.         cout << s3 << endl;
  160.         char arr1[] = "types";
  161.         char16_t arr2[] = u"types";
  162.         char32_t arr3[] = U"types";
  163.         wchar_t arr4[] = L"types";
  164.         cout << sizeof(arr1) << endl;
  165.         cout << sizeof(arr2) << endl;
  166.         cout << sizeof(arr3) << endl;
  167.         cout << sizeof(arr4) << endl;
  168.         char arr5[] = "苹果 apple";
  169.         cout << sizeof(arr5) << endl;
  170.         arr5[1]++;
  171.         arr5[1]++;
  172.         arr5[1]--;
  173.         arr5[1]--;
  174.         arr5[1]--;
  175.         arr5[1]--;
  176.         arr5[3]--;
  177.         arr5[3]--;
  178.         arr5[3]--;
  179. }
  180. //int main()
  181. //{
  182. //        test_string8();
  183. //
  184. //        return 0;
  185. //}
  186. #include<vector>
  187. int main()
  188. {
  189.         vector<int> v1;
  190.         vector<int> v2(10, 1);
  191.         v1.push_back(1);
  192.         v1.push_back(2);
  193.         v1.push_back(3);
  194.         v1.push_back(4);
  195.         // 遍历
  196.         for (size_t i = 0; i < v1.size(); i++)
  197.         {
  198.                 cout << v1[i] << " ";
  199.         }
  200.         cout << endl;
  201.         vector<int>::iterator it1 = v1.begin();
  202.         while (it1 != v1.end())
  203.         {
  204.                 cout << *it1 << " ";
  205.                 ++it1;
  206.         }
  207.         cout << endl;
  208.         for (auto e : v1)
  209.         {
  210.                 cout << e << " ";
  211.         }
  212.         cout << endl;
  213.         vector<string> vstr;
  214.         string s1 = "张三";
  215.         vstr.push_back(s1);
  216.         vstr.push_back("李四");
  217.         for (const auto& e : vstr)
  218.         {
  219.                 cout << e << " ";
  220.         }
  221.         cout << endl;
  222.         vstr[0] += 'x';
  223.         vstr[0] += "apple";
  224.         //vstr[0][0]++;
  225.         vstr[0][1]++;
  226.         vstr[0][1]++;
  227.         vstr.operator[](0).operator[](1)++;
  228.         for (const auto& e : vstr)
  229.         {
  230.                 cout << e << " ";
  231.         }
  232.         cout << endl;
  233.         return 0;
  234. }
复制代码

完——

下次继续吧。。。vector
我和你—神奇阿呦

至此结束!
我是云边有个稻草人
期待与你的下一次相遇!



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表