简单模拟STL库中string的实现

#include<iostream>
#include<assert.h>
#include<malloc.h>
#define CAPACITY 3
using namespace std;

class String
{
public:
	String(char *str="")
		:_str((char*)malloc(strlen(str)+1)),
	     _size(strlen(str))
	{
		strcpy(_str, str);
		_capacity = _size+1;
		cout << "构造函数" << endl;
	}
	String(String  const&objstr)
		:_str(NULL),
		_size(objstr._size),
		_capacity(objstr._capacity)
	{
		String tmp(objstr._str);
		swap(_str, tmp._str);
	}
	~String()
	{
		cout << "析构函数" << endl;
		if (_str)
		{
			free(_str);
		}

	}
	size_t newcapacity(size_t size)
	{
		if (size > _capacity)
		{

			_str = (char*)realloc(_str, (size + CAPACITY));

		}
		return size + CAPACITY;
	}
	void display()
	{
		cout << _str << endl;
	}
	void Pushback(char str)
	{
		int size = _capacity+1;
		_capacity = newcapacity(size);
		_str[_size] = str;
		_str[_size + 1] = ‘\0‘;
		_size = _size + 1;
	}
	int Find(char x)
	{
		if (_str == NULL)
		{
			return -1;
		}
		int i = 0;
		for (; i <= (int)_size; i++)
		{
			if (_str[i] == x)
			{
				return i;
			}
		}
		return -1;
	}
	void insert(char x, size_t pos)
	{
		int size = _size + 1;
		_capacity = newcapacity(size);
		int i = _size;
		for (; i >(int)pos; i--)
		{
			_str[i+1] = _str[i];
		}
		_str[pos+1] = x;
		_size = _size + 1;
	}
	String &operator =(String const &str)
	{
		if (str._str == NULL)
		{
			_str = NULL;
			_size = str._size;
     		return *this;
		}
		_capacity = newcapacity(str._capacity);
		char *str1 = str._str;

		strcpy(_str, str1);
		_size = str._size;
		return *this;
	}
	int &operator>(String const &str)
	{
		int ret = strcmp(_str, str._str);
		return ret;
	}
private:
	char * _str;
	size_t _size;
	size_t _capacity;
};

void Test1()
{
	String str1("abcdef");
	String str2(str1);
	int ret=str2.Find(‘d‘);
	str2.insert(‘x‘, ret);
	str2.Pushback(‘a‘);
	cout << ret << endl;
	str2.display();
}

void Test2()
{
	String s1("abcdef");
	String s2("efghlmn");
	s1 = s2;
	s1.display();
}

int main()
{
	//Test1();
	Test2();
	return 0;
}
时间: 2024-10-05 05:32:24

简单模拟STL库中string的实现的相关文章

STL库中string类的探究

在STL中有着一个类就是string类,他的内存布局和存储机制究竟是怎么样的呢? 这就是建立好的string 可以看出,图中用黄色框框标注的部分就是主要区域 我们用来给string对象进行初始化的字符串被存储在了_Buf当中,_Mysize和_Myres就不用说了,就是上面的size 和 capacity 的值. 当只有一个字符作为字符串的时候,就可以很明显的看出来了,_Mysize是指字符串的length _Myres还是没有改变,_Myres最大就是15么? 此时还没有变化,再加入一个字符

sort在STL库中是排序函数

sort在STL库中是排序函数,有时冒泡.选择等O(N^2)算法会超时时,我们可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm>库里面,原型如下: 1 2 3 4 template <class RandomAccessIterator>  void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIte

STL库中简单的list类模板示例和一个小的延时程序

先贴代码: #include "stdafx.h" #include <iostream> #include <list> #include <ctime> using namespace std; void mysleep(int second) { clock_t st; st=clock();//该程序从启动到函数调用占用CPU的时间 while(clock()-st<second*CLOCKS_PER_SEC);//#define CL

STL库中的正态分布函数

在设计抽奖一类程序中,有时会需要一种概率“有较大可能获得一个普通结果,有较小可能获得一个糟糕或极好的结果”,这就可以用正态分布函数来获得这样一个结果. STL中已经提供了一系列随机分布的函数,包括正态分布,泊松分布等 头文件: random 函数: std::normal_distribution<type> distribution( σ,μ ) 其中σ为正态分布的平均数学期望,也就是正态曲线中高峰的x值,μ值越大曲线坡度约缓,反之则越陡,在x轴上, (0,σ * μ) 占据了曲线的大部分空

【转】next_permutation和prev_permutation(STL库中的全排列函数)用法

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm> 下面是以前的笔记    与之完全相反的函数还有prev_permutation,查询当前排序上一个字典序.   返回为bool型,若返回true则成功生成,返回false则失败,还原到升序或降序的排列,与sort连用风味更佳   (1) int 类型的next_permutation   int main() {  int a[3]; a[0]=1;a[1]=2;a[2]=3;  do { cout<

C++STL库中map容器常用应用

#include<iostream> #include<cstdio> #include<map> //按键值大小构成二叉搜索树 using namespace std; map<int, string> a; int main() { a.insert(map<int, string>::value_type(1,"li")); a.insert(map<int, string>::value_type(1,&q

C++ STL库中各种有用的库函数

__builtin_popcount(i);//计算i的二进制表示中1的个数 int a[M] , b[M] ; memcpy(a+i , b+j , sizeof(int)*s) ; //把b数组中[j , j+s-1]这段复制到a数组中[i , i+s-1]

C++STL库中vector容器常用应用

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { vector<int> vec; vec.push_back(1);//在尾部插入元素 vec.push_back(2); // cout<<vec[1];//按下标访问元素,从[0]开始 /* //使用迭代器访问元素 vector<int>::iterat

C++STL 库中set容器应用

#include<iostream> #include<cstdio> #include<set> using namespace std; set<int> a; int main() { //插入元素 a.insert(1); a.insert(3); a.insert(5); //用迭代器遍历容器; set<int>::iterator it; for(it=a.begin(); it!=a.end(); it++) { cout<&