c++之string

导语:string 作为c++中我们第一次接触的由c++提供的库的类,可以这么说,当完全理解了string的逻辑后,对于后面其他数据结构的理解也会变得很简单

string

其实string类的底层如果通俗的理解的话,他其实就是每个元素的类型为char的顺序表

class string {
public:
	typedef char* iterator;
	string(const char* = "");
	string(string&);
	~string();
	char* c_str();
	char& operator[](size_t pos);
	iterator begin();
	iterator end();
	size_t size();
	size_t capacity();
	string& operator=(string&);
	string substr(size_t pos, size_t len = nopos);
	friend ostream&(ostream& out,const string& str);
private:
	char* _str;
	size_t _size;
	size_t _capacity;
};

在这里由于只是去理解string 的底层逻辑,因此这里只介绍上面的函数,如果对string的其他函数也感兴趣,可以去了解string的全部类函数,

这里是引用
string::string - C++ Reference (cplusplus.com)

string::string(const char* ch = " ")

首先讨论为什么这里用全缺省,由于当定义直接定义一个string时我们希望的string内部值存储’\0’而不是随机开辟空间造成不必要的麻烦,因此,这里我们默认的传值设置为指向’\0’的字符串,这样可以方便初始化。下面看代码

string::string(const char* ch) {
	_size = strlen(ch);
	_capacity = _size;
	_str = new char[_size + 1];
	strcpy(_str, ch);
}
string::string(const char* ch):\
_str(new char[strlen(ch)])\
,_size(strlen(ch)),_capacity(strlen(ch)){
     strcpy(_str,ch);
}

这里给出的两种方式,这里我们可以用初始化列表,也可以用函数直接实现,但是这里我更推荐用第一种,由于第二种strlen函数用了三次,使得函数的效率降低了很多。

string::c_str(),string::size(),string::capacity()

char* string::c_str() {//c_str()函数是提供接口使得c++和c可以联系起来
	return _str;
}
size_t string::size() {
	return _size;
}
size_t string::capacity() {
	return _capacity;
}

这里由于这三个函数都十分简单,我们将他们统一写

string::string(string& str);

//他的实现是建立在上面函数的基础之上
string::string(string& str) {
	_str = new char[str.capacity() + 1];
	strcpy(_str,str.c_str());
	_size = str.size();
	_capacity = str.capacity();
}

string& string::operator=(const string& str)

char& string::operator[](size_t pos);

string& string::operator=(string& str)
{
	_str = new char[str.capacity() + 1];
	strcpy(_str, str.c_str());
	_size = str.size();
	_capacity = str.capacity();
	return *this;
}
char& string::operator[](size_t pos)
{
	return _str[pos];
}//这里的作用和顺序表的作用相同直接通过运算符重载提供接口使得可以改变内容

ostream& operator<<(ostream& out, const string& str)

ostream& operator<<(ostream& out, const string& str) {
	cout << str.c_str() << endl;
	return out;
}

string::iterator

其实前面的所有的内容在我看来都很简单,其实就是控制这个顺序表进行的操作,但是,区别于指针,c++在标准库中提出了iterator(迭代器),在string这里我们可以暂时将他理解为指针,但是注意iterator不是指针只是他的很多作用和指针相似,因此我们为了理解他的作用,我们在初学阶段将他理解为指针是一种很好的选择。
先来看看iterator的一些应用场景

string str = "hello world";
string::iterator it = str.begin();
while (it != str.end()) {
	cout << *it;
	++it;
}
结果 : hello world

不难发现iterator 在这里的作用和指针相似,通过begin()和end()接口,我们可以获得"头指针"“尾指针”,然后遍历,但是iterator的提出是具有开创性的,比如在链表中,很显然指针是无法达到这种效果的,一次,在底层中我们可以通过重载链表的++使他可以达到这种效果,这样的好处是可以使的c++的库中具有统一性,方便我们进行利用

总结:说白了,string 的底层就是顺序表,所以学好顺序表可以帮助我们更好的理解string,当然string中也提供了c中没有的全新的结构,例如iterator。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值