C++ —— STL容器分析(2)
来源:互联网 发布:网络教学培训 编辑:程序博客网 时间:2024/05/01 01:19
今天在看STL的时候,发现标准容器当中存储的对象必须是可构造拷贝的!为什么呢,从上一张对STL容器的性能分析中,意外的发现了这个原因!
STL中的容器都是自动扩展的,而且可以提前分配出空间,当使用时在将对象填入其中。
但会发现C++分配内存是使用的new,而不是malloc(),在C中可以用malloc分配出一个空间,然后用指针指向它,当时用的时候在填入数据。在c++中则不推荐使用malloc,因为这样无法保证对象的初始化和销毁。
在c++使用new分配空间,则会自动调用构造函数,这是就会发现问题了!
例如下面这个类
class test ...{
public:
test(int i)
}
test(const test &) ...{
}
};
public:
test(int i)
}
test(const test &) ...{
}
};
如果想创建这么一个对象,则需要传递一个整型的参数!
但是当标准容器想扩充多余的空间,留着以后使用的时候,他会使用new来分配出来,但是容器并不知道需要传递给构造函数什么参数!
这就是问题的所在,那怎么扩充呢
#include <cstdlib>
#include <iostream>
#include <vector>
#include "TestTime.h"
using namespace std;
class arr ...{
public:
static int con;
arr(int i) : id(++con) ...{
cout << "con" << id << endl;
}
~arr() ...{
cout << "des" << id << endl;
}
arr(const arr &a) ...{
id = ++con;
cout << "copy con" << id << endl;
}
int id;
int i[10];
};
int arr::con = 0;
int main(int argc, char *argv[])
...{
vector<arr> intvec;
for (int i = 0; i < 10; i++) ...{
intvec.push_back(i);
}
#include <iostream>
#include <vector>
#include "TestTime.h"
using namespace std;
class arr ...{
public:
static int con;
arr(int i) : id(++con) ...{
cout << "con" << id << endl;
}
~arr() ...{
cout << "des" << id << endl;
}
arr(const arr &a) ...{
id = ++con;
cout << "copy con" << id << endl;
}
int id;
int i[10];
};
int arr::con = 0;
int main(int argc, char *argv[])
...{
vector<arr> intvec;
for (int i = 0; i < 10; i++) ...{
intvec.push_back(i);
}
cout << " ------------- " << intvec.capacity() << endl;
system("PAUSE");
return EXIT_SUCCESS;
}
system("PAUSE");
return EXIT_SUCCESS;
}
运行这个程序你会发现,多了好几次拷贝构造函数的调用!
可以使用vector::capacity来查看当前所拥有的空间!
所以可以确定标准容器是使用拷贝构造函数来分配出新的空间!
如果把拷贝构造函数声明称private,编译时则会出现错!所以容器中的对象必须是可构造拷贝的!
- C++ —— STL容器分析(2)
- C++分析——容器STL
- STL容器 — 顺序容器
- STL—其它容器
- STL—容器
- STL — 关联容器
- 【C/C++】STL容器
- C++STL泛型编程——vector向量容器
- C++——STL中三种顺序容器的简要区别
- STL学习2——序列容器
- STL容器分析
- C++(12)STL实践与分析之顺序容器
- C++(14)STL分析与实践之容器适配器
- c++STL之顺序容器(vector、deque、list)分析
- C/C++知识要点2——STL中Vector、Map、Set容器的实现原理
- C++STL学习(2)容器deque
- C++STL容器
- C++STL容器简介
- 工作流开源项目汇总
- C的Base64加密
- 可变长度参数 char frm,... char frm...
- 深圳针刺毡;深圳过滤袋;深圳除尘袋;深圳工业用布 Shenzhen Needle Punched Felt, Shenzhen Filter Bag,
- .Net类库中实现的HashTable
- C++ —— STL容器分析(2)
- 2.22 Java notes - Enumeration Classes
- 网页的位置编程
- 还有多少程序员可以疯狂
- [翻译]在asp.net 2.0中使用WebParts
- 使用ASP.NET 2.0中的ReportViewer控件
- Java1.6.0实现系统托盘技术
- va_list是一个宏,由va_start和va_end界定,一时难说清,详细见《Windows32程序设计》Unicode部分
- 在面对级联关联(one-to-many......)查询的时候,你是怎么解决hibernate session关闭的?我是这样做的。