Open bosthhe1 opened 1 year ago
int main()
{
string d1("hello world");
string d2(d1, 2, 7);//部分拷贝初始化,从第二个位置,向后拷贝5个字符。
string d3(d1, 2);//如果这里不给值,会默认是-1,拷贝的时候 会转化为无符号整型(2^32),进行拷贝,直到把字符取完
cout << d2 << endl;
cout << d3 << endl;
return 0;
}
int main()
{
string d1;
d1 = "qwert";//赋值符重载
//d1.operator = ("qwert");//和上面等价
cout << d1.size() << endl;//计算字符串长度,不包括'/0'
cout << d1.length() << endl;//计算字符串长度,不包括'/0',这两个功能一样,但是具体区别不太了解
return 0;
}
int main()
{
string d1,d2;
d1 = "q";
d2 = "qwertyuiopasdfghjkl";
cout << d1.capacity() << endl;//计算容量,容量就很好理解,一开始给的容量为15,不够再扩容
cout << d2.capacity() << endl;//15容量不够扩容为31
return 0;
}
int main()
{
string d1,d2;
d1 = "q";
d2 = "qwertyuiopasdfghjkl";
d1.clear();//清除数据
d2.clear();
cout << d1 << endl;//这里数据被清理了,所以只输出了换行符
cout << d2 << endl;
cout << d1.capacity() << endl;//容量已经开好了,不可能回收,还是15
cout << d2.capacity() << endl;//31
return 0;
}
int main()
{
string d1;
d1 = "hello world";
cout << d1[1] << endl;//这里看似像解引用,但其实是对[]运算符重载
cout << d1.operator[](1) << endl;//取对第1个位置的引用(读的功能)
return 0;
}
int main()
{
string d1;
d1 = "hello world";
cout << d1 << endl;
for (size_t i = 0; i < d1.size(); i++)
{
d1[i] += 1;//对第i的位置引用加一(写的功能)
}
cout << d1 << endl;
return 0;
}
int main()
{
string d1;
d1 = "hello world";
cout << d1.operator[](1) << endl;
cout << d1.at(1) << endl;//这里at和operator都是对字符的引用,但是底层判错的方式不同
return 0;
}
operator如果越界访问,会直接断言结束程序 at如果发生越界访问,会抛异常
int main()
{
string d1;
d1 = "hello world";
d1.push_back('q');//只能插入字符
d1.append("asd");//插入字符或字符串
cout << d1 << endl;
return 0;
}
int main()
{
string d1;
d1 = "hello world";
d1 += "hah";//运算符重载,追加字符或者字符串
cout << d1 << endl;
return 0;
}
string的模拟实现https://gitee.com/hexhong/cpushpush/issues/I650I0
str.c_str()和str本身的区别,str.c_str(),是返回的const char*的指针,遇到"\0"就停止,但是str本身是按照size的大小计算的,不按照 “\0”来走,比如“abcd\0efg”,str.c_str()打印出来就是abcd,而str本身打印出来时"abcd efgh";所以二者存在很大差别。
以前我们知道vs中32位操作地址,1个std::string的占用空间为28字节,其中包含三个指针和一个16字节的数组 但是linux中的一个32位操作,1个std::string的占用空间为4,64位为8 这是因为linux中就使用了一个指针指向一块地址空间,看下图,p指向一个空间,空间中第一个位置存size,第二个寸capacity,第三个存str,可以通过p指针加加减减等操作来实现对这些地址的访问 如果string p1(p);就会将p1指向p,和p共用,如果谁需要修改string中的内容,那么谁就写时拷贝,由于链接少了一个引用计数--;析构的时候,只有当引用计数--为0的时候,才会真正析构 这就相当于赌你不会改变string,那么这么多重复的string都指向一个空间,这样节约资源,也提高效率,如果谁更改那么谁就写时拷贝,这样也和vs里面的性能一样,只要你不改动,我就赢
学到这里才对cpp又更深刻的认识,cpp才算真正的开始,我们看到这里是直接调用的函数接口,和日期类相似,初始化和拷贝构造,重载流插入运算符