关于C++的STL的学习与再认识(一)
来源:互联网 发布:js file input 编辑:程序博客网 时间:2024/05/17 00:04
以前学习c++的时候,对比较基础的两点有一定的害怕,就是涉及指针的部分和STL。虽然一直在指针方面下功夫学习,也写过文章记录心得,希望以后碰到指针的问题能够解决。至于STL,在之前对基本的算法有了实现,想对STL有一个较深的认识,写下文章记录学习过程。
STL:标准模板库(Standard Template Library—STL)
容器
用途:操作大量数据是会某种用到容器。c语言只有一种内置容器,数组。
因为数组的功能有限,所以为这个容器开发出接口,对任何数据类型都能够使用,这就是STL的思想。
vector
最简单的STL的容器,其实就是一个拥有扩展功能的数组。
唯一一个向后兼容c代码的容器(实际上就是数组)
vector<int> v(10); for (int i = 0; i < 10; i++) { v[i] = i * i; }
注意下面两者的差异:
vertor<int> v[10];vertor<int> v(10);
前者声明了一个存有10个vertor<int>
类型元素的数组,初始化为空。
大部分情况下我们用的是后者,声明一个大小为10的数组。
获取容器大小:int number = v.size()
:返回无符号值
判断一个容器时候为空时,常用的empty()函数:
bool is_nonempty_notgood = (v.size() >= 0); // Try to avoid thisbool is_nonempty_ok = !v.empty();
这是因为size()函数对vertor的元素计数,不是所有容器都能在常量时间内返回自己的大小,而且你绝不应该为了确定链表中至少包含一个节点元素就对一条双链表中的所有元素计数。
vector<int> v(10); for (int i = 0; i < 10; i++) { v[i] = i * i; } v.resize(15); for (int i = 0; i < 5; i++) { v.push_back(100); } cout << v.size() << endl; //20 for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; } //20 //0 1 4 9 16 25 36 49 64 81 0 0 0 0 0 100 100 100 100 100 100
1.push_back()函数:向vertor尾部添加一个元素,容器长度加1。每次用push_back()添加新元素时,vertor分配的内存空间总是比实际需要的多,因此不用担心内存分配问题。
2.resize()函数:重新改变vertor的大小。若改变后小于当前大小,则多余的元素被删除;若大于当前,以0填充新元素。
注意:使用resize()后用push_back()的元素,并不是位于新分配的内存中,而是在新分配分寸的后面。上面例子,vertor的大小为10,改变后为15,push_back()后的元素放在了15–20的位置处。且size为20.
3.clear()用来清空vertor,是vertor包含0个元素。(删除所有元素,变为空容器)
初始化verotr:
vector<int> v2 = v;print(v2);vector<int> v3(v);print(v3);
上面两种初始化方式得到的结果与v一样。
若是其他类型:vertor<string> s(20, "sunwen")
.
多维数组:最常见的就是二维数组,创建一个存储vertor元素的vertor。
print(vector<int>(n, 10)); //10 10 10 10 10vector< vector<int> > f(n, vector<int>(m, 10));
上述代码先是初始化了一个一维数组。接着初始化了二位数组f,是一个n*m的矩阵,所有元素用10填充。
当vertor用作参数时,实际上是复制了这个vertor(值传递)。避免浪费大量时间和内存,永远不要这样写: void print(vector<int> v)
应该使用下面的方法: void print(const vector<int>& v)
如果需要在函数中改变vertor的值,去掉const修饰符。
参考文章:Power up C++ with the Standard Template Library
- 关于C++的STL的学习与再认识(一)
- 关于c++的STL的学习与再认识(二)
- 关于c++中的STL的学习与再认识(三)
- 关于C++STL模板库的一些总结(一)
- [C++][STL](一)vector和stack的学习
- layout_weight属性的再认识
- 最小二乘法的再认识
- sql注入的再认识
- 指针的再认识
- hashMap的再认识
- 对Integer的再认识
- 重读《大数据时代》:关于大数据的再认识
- 【SSH】ssh再认识(一)
- STL string 的学习(一)
- 产品设计:产品设计中模块化设计的再认识与思考
- STL的学习(C++primer)
- 关于c/c++的学习问题一
- 零售业数据挖掘的再认识
- 网络编程系列之五 libpcap库(共24个函数的实例)
- Ubuntu之nginx配置虚拟主机vhost
- UVA 579 Clock Hands
- BtTracker原理
- Android基础_浅谈广播机制
- 关于C++的STL的学习与再认识(一)
- tm->tm_mday = day + 1
- 黑马程序员——Java基础——IO(二)
- 如何使用fiddler2对主流物联网云平台yeelink、乐联进行http分析
- 技术文章聚类
- Python-easy_install的安装
- Ubuntu下使用Vi是方向键变乱码 退格键不能使用的解决方法
- Apache Shiro 验证
- LACP