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++)