std::string

http://www.cplusplus.com/reference/string/string/

1.string

a.打印数据结构

p *(string._M_rep())

p  (string._M_data())

 

b.写时拷贝

string a=“test”;

string b(a);

两者的data指向同一块内存,此时引用计数_M_refcount = 1;

当使用非const方法时,就会申请新的内存和拷贝。

 

c.

string getstr()

{

return "test";

}

main()

{

const char *p = getstr.c_srt();

cout<<p;

}

此时,getstr产生的string临时对象在复制后就释放了,所以data也就释放了。

应该先赋值给一个string对象,这样才会调用string拷贝或者赋值构造函数。

d.

typedef struct node

{

int a;

string str;

}node

main()

{

node* it = new (node)//malloc(sizeof(node));

it->str = "test";

free(it);

}

string要默认构造函数才能访问,不然会段错误。malloc的时候不会调用默认构造。

需要用new,或者用临时变量node a ;a.str = "test";

e. sstream可以用于string和int,double之间的转换。

double a = 9.9; //string a = "9.9";

stringstream stream;

stream <<a;

string result; // double result;

stream>>result;

2.vector

a.   size()表示容量,capacity()表示内存;

若内存不够会扩大一倍原有的内存,和string一样;

最好已经开始就reserve()内存,避免扩大内存时候的内存申请拷贝释放。

b. vector<int> vec;

vec.reserve(100);

vec.reserve(10);//capacity 还是100

vector<int>(vec).swap(vec);//会创建一个只有使用到内存的里临时变量,来替换vec;相当于清理了vec未使用的内存。

c.迭代器使用后就失效,list不会。

3.list

a.list是双向链表,头结点是栈空间,插入的结点都是堆空间的。

b.list的迭代器使用了不会失效,处理erase(it),应该要erase(it++)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值