c++学习第十二天

创作过程中难免有不足,若您发现本文内容有误,恳请不吝赐教。


提示:以下是本篇文章正文内容,下面案例可供参考。

一、string模拟实现

1.构造和析构

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
#include<string>

namespace bit
{
	class string
	{
	public:
		string()
			:_str(new char[1]{'\0'})
			,_size(0)
			,_capacity(0)
		{}
		string(const char* str = "")
			:_size(strlen(str))
			, _capacity(_size)
		{
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		const char* c_str() const
		{
			return _str;
		}
	private:
		char* _str;
		size_t _size;
		size_t _capacity;
	};
}

int main()
{
	string s1("hello world");
	cout << s1.c_str() << endl;

	string s2;
	cout << s2.c_str() << endl;

	return 0;
}

2.遍历

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
#include<string>
#include<assert.h>

namespace bit
{
	class string
	{
	public:
		string(const char* str = "")
			:_size(strlen(str))
			, _capacity(_size)
		{
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		char& operator[](size_t pos)
		{
			assert(pos<_size);
			return _str[pos];
		}
		size_t c_size() const
		{
			return _size;
		}
		size_t c_capacity() const
		{
			return _capacity;
		}
		const char* c_str() const
		{
			return _str;
		}
	private:
		char* _str;
		size_t _size;
		size_t _capacity;
	};
}
int main()
{
	string s1("hello world");

	for (size_t i = 0; i < s1.size(); i++)
		cout << s1[i] << " ";

	return 0;
}

3.迭代器

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
#include<string>
#include<assert.h>

namespace bit
{
	class string
	{
	public:
		typedef char* iterator;
		iterator begin()
		{
			return _str;
		}
		iterator end()
		{
			return _str+_size;
		}
		string(const char* str = "")
			:_size(strlen(str))
			, _capacity(_size)
		{
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		char& operator[](size_t pos)
		{
			assert(pos<_size);
			return _str[pos];
		}
		size_t c_size() const
		{
			return _size;
		}
		size_t c_capacity() const
		{
			return _capacity;
		}
		const char* c_str() const
		{
			return _str;
		}
	private:
		char* _str;
		size_t _size;
		size_t _capacity;
	};
}

int main()
{
	string s1("hello world");

	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	for(auto ch:s1)
		cout << ch << " ";

	return 0;
}

4.push_back 、 append 、reserve

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
#include<string>
#include<assert.h>

namespace bit
{
	class string
	{
	public:
		string(const char* str = "")
			:_size(strlen(str))
			, _capacity(_size)
		{
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		void reserve(size_t n)
		{
			if (n > _capacity)
			{
				char* tmp = new char[n + 1];
				strcpy(tmp, _str);
				delete[]  _str;
				_str = tmp;
				_capacity = n;
			}
		}
		void push_back(char ch)
		{
			if (_size == _capacity)
			{
				reserve(_capacity == 0 ? 4 :_capacity * 2);
			}
			_str[_size] = ch;
			_size++;
			_str[_size] = '\0';
		}
		void append(const char* str)
		{
			size_t len = strlen(str);
			if (len + _size > _capacity)
			{
				reserve(len + _size);
			}
			strcpy(_str + _size, str);
			_size += len;
		}
		size_t c_size() const
		{
			return _size;
		}
		size_t c_capacity() const
		{
			return _capacity;
		}
		const char* c_str() const
		{
			return _str;
		}
	private:
		char* _str;
		size_t _size;
		size_t _capacity;
	};
}

int main()
{
	string s1("hello world");
	cout << s1.c_str() << endl;

	s1.push_back('g');
	s1.append("!");
	cout << s1.c_str() << endl;

	return 0;
}

5.+=

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
using namespace std;
#include<string>
#include<assert.h>

namespace bit
{
	class string
	{
	public:
		string(const char* str = "")
			:_size(strlen(str))
			, _capacity(_size)
		{
			_str = new char[_capacity + 1];
			strcpy(_str, str);
		}
		void reserve(size_t n)
		{
			if (n > _capacity)
			{
				char* tmp = new char[n + 1];
				strcpy(tmp, _str);
				delete[]  _str;
				_str = tmp;
				_capacity = n;
			}
		}
		void push_back(char ch)
		{
			if (_size == _capacity)
			{
				reserve(_capacity == 0 ? 4 :_capacity * 2);
			}
			_str[_size] = ch;
			_size++;
			_str[_size] = '\0';
		}
		void append(const char* str)
		{
			size_t len = strlen(str);
			if (len + _size > _capacity)
			{
				reserve(len + _size);
			}
			strcpy(_str + _size, str);
			_size += len;
		}
		string& operator+=(char ch)
		{
			push_back(ch);
			return *this;
		}
		string& operator+=(const char* str)
		{
			append(str);
			return *this;
		}
		size_t c_size() const
		{
			return _size;
		}
		size_t c_capacity() const
		{
			return _capacity;
		}
		const char* c_str() const
		{
			return _str;
		}
	private:
		char* _str;
		size_t _size;
		size_t _capacity;
	};
}

int main()
{
	string s1("hello world");
	cout << s1.c_str() << endl;

	s1 += '*';
	s1 += "########";
	cout << s1.c_str() << endl;

	return 0;
}

6.比较运算符

cpp 复制代码
		bool operator<(const string& s) const
		{
			return strcmp(_str, s._str) < 0;
		}
		bool operator==(const string& s) const
		{
			return strcmp(_str, s._str) == 0;
		}
		bool operator<=(const string& s) const
		{
			return *this < s || *this == s;
		}
		bool operator>(const string& s) const
		{
			return !(*this <= s);
		}
		bool operator>=(const string& s) const
		{
			return !(*this < s);
		}
		bool operator!=(const string& s) const
		{
			return !(*this == s);
		}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了c++基础知识。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习