bosthhe1 / cpushpush

0 stars 0 forks source link

string初识 #14

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago
int main()
{
    string d1("hello world");
    string d2(d1);
        srting d3;
        cin>>d3;(重载运算符,流插入)
    cout << d1 << endl;
    cout << d2 << endl;
        cout << d3 << endl;
}

学到这里才对cpp又更深刻的认识,cpp才算真正的开始,我们看到这里是直接调用的函数接口,和日期类相似,初始化和拷贝构造,重载流插入运算符

bosthhe1 commented 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;
}

Q`J_I@K NDKEQWZ MJ`{96M

bosthhe1 commented 1 year ago
int main()
{
    string d1;
    d1 = "qwert";//赋值符重载
    //d1.operator = ("qwert");//和上面等价
    cout << d1.size() << endl;//计算字符串长度,不包括'/0'
    cout << d1.length() << endl;//计算字符串长度,不包括'/0',这两个功能一样,但是具体区别不太了解
    return 0;
}

BPI6ZBK226S{3GDF%J4GLQ3

bosthhe1 commented 1 year ago
int main()
{
    string d1,d2;
    d1 = "q";
    d2 = "qwertyuiopasdfghjkl";
    cout << d1.capacity() << endl;//计算容量,容量就很好理解,一开始给的容量为15,不够再扩容
    cout << d2.capacity() << endl;//15容量不够扩容为31
    return 0;
}

image

bosthhe1 commented 1 year ago
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;
}

image

bosthhe1 commented 1 year ago
int main()
{
    string d1;
    d1 = "hello world";
    cout << d1[1] << endl;//这里看似像解引用,但其实是对[]运算符重载
    cout << d1.operator[](1) << endl;//取对第1个位置的引用(读的功能)
    return 0;
}

image

bosthhe1 commented 1 year ago
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;
}

image

bosthhe1 commented 1 year ago
int main()
{
    string d1;
    d1 = "hello world";
    cout << d1.operator[](1) << endl;
    cout << d1.at(1) << endl;//这里at和operator都是对字符的引用,但是底层判错的方式不同
    return 0;
}

17$ %V(J_}3E7YPQ0M {D%R operator如果越界访问,会直接断言结束程序 at如果发生越界访问,会抛异常

bosthhe1 commented 1 year ago
int main()
{
    string d1;
    d1 = "hello world";
    d1.push_back('q');//只能插入字符
    d1.append("asd");//插入字符或字符串
    cout << d1 << endl;
    return 0;
}

image

bosthhe1 commented 1 year ago
int main()
{
    string d1;
    d1 = "hello world";
    d1 += "hah";//运算符重载,追加字符或者字符串
    cout << d1 << endl;
    return 0;
}

image

bosthhe1 commented 1 year ago

string的模拟实现https://gitee.com/hexhong/cpushpush/issues/I650I0

bosthhe1 commented 1 year ago

str.c_str()和str本身的区别,str.c_str(),是返回的const char*的指针,遇到"\0"就停止,但是str本身是按照size的大小计算的,不按照 “\0”来走,比如“abcd\0efg”,str.c_str()打印出来就是abcd,而str本身打印出来时"abcd efgh";所以二者存在很大差别。

bosthhe1 commented 1 year ago

以前我们知道vs中32位操作地址,1个std::string的占用空间为28字节,其中包含三个指针和一个16字节的数组 但是linux中的一个32位操作,1个std::string的占用空间为4,64位为8 这是因为linux中就使用了一个指针指向一块地址空间,看下图,p指向一个空间,空间中第一个位置存size,第二个寸capacity,第三个存str,可以通过p指针加加减减等操作来实现对这些地址的访问 image 如果string p1(p);就会将p1指向p,和p共用,如果谁需要修改string中的内容,那么谁就写时拷贝,由于链接少了一个引用计数--;析构的时候,只有当引用计数--为0的时候,才会真正析构 这就相当于赌你不会改变string,那么这么多重复的string都指向一个空间,这样节约资源,也提高效率,如果谁更改那么谁就写时拷贝,这样也和vs里面的性能一样,只要你不改动,我就赢