C++学习笔记7——vector
2015-10-10 19:58
706 查看
1,头文件与命名空间
2,属性
vector不是一个数据类型,也不是类,而是一个类模板(class template)
vector的每一个具体实现才是类。
个人理解,C++用vector来取代C语言中的数组。
3,vector对象的定义和初始化
四种方式:
T为数据类型内置类型或类类型都可以
第5种方式,用数组或数组的一部分初始化:
则ivec里包含a[i]到a[j-1]的内容
注意:j一定要大于i
如果j == i,不报错,但是ivec里面没有内容;
如果j < i,一定会报错
4,vector对象的操作
(1)size:返回相应vector类定义的size_type。
注意,这个size_type是特定类类型的size_type,所以必须用域操作符指明。
(2)push_back
在vector的最后插入新的元素。
这个操作会改变vector的长度,即改变size的输出
(3)empty
判断vector是否为空
(4)下标操作
类似于数组,用于读写,获取已经存在的元素。
但是千万注意,下标操作不能用来增加vector的长度,即不能用来添加元素,否则会造成“缓冲区溢出”(buffer overflow).
要想添加元素,请用push_back成员函数。
(5)erase 删除vector中的元素
这个操作并不是仅仅将已有的元素置为0,而是真正的删除它,会缩短vector的长度。
vector::erase()方法有两种重载形式
如下:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
示例:
5,备注
1,该vector的元素是const的,所以里面的值不能修改。
对于
在g++下根本无法编译通过。
所以结论是:不要使用这种表达方式。
#include <vector> using std::vector;
2,属性
vector不是一个数据类型,也不是类,而是一个类模板(class template)
vector的每一个具体实现才是类。
个人理解,C++用vector来取代C语言中的数组。
vector<int> ivec ; vector<string> svec; vector<xy_vect> xyvec; //vector<int> vector<string>和vector<xy_vect>才是数据类型
3,vector对象的定义和初始化
四种方式:
T为数据类型内置类型或类类型都可以
unsigned int n = 5; vector<T> v1; //v1为空,长度为0 vector<T> v2(v1); //v2为v1的一个副本,用v1来初始化v2 vector<T> v3(n,i); // i为T类型的变量(或字面值),或可以自动转化为T类型。n可以是变量或字面值。 vector<T> v4(n); //如果T为内置类型,则v4含有n个0,若T为类类型,则用默认构造函数来初始化。对于第四种方式需要注意,如果T是类类型,其定义了构造函数但是没有定义默认构造函数,则不能使用这种vector定义方式。
第5种方式,用数组或数组的一部分初始化:
int a[5] = {1,2,3,4,5}; vector ivec(a+i,a+j);
则ivec里包含a[i]到a[j-1]的内容
注意:j一定要大于i
如果j == i,不报错,但是ivec里面没有内容;
如果j < i,一定会报错
4,vector对象的操作
(1)size:返回相应vector类定义的size_type。
注意,这个size_type是特定类类型的size_type,所以必须用域操作符指明。
vector<int>::size_type //ok! vector::size_type //error!
(2)push_back
在vector的最后插入新的元素。
这个操作会改变vector的长度,即改变size的输出
ivect.push_back(3);
(3)empty
判断vector是否为空
(4)下标操作
类似于数组,用于读写,获取已经存在的元素。
但是千万注意,下标操作不能用来增加vector的长度,即不能用来添加元素,否则会造成“缓冲区溢出”(buffer overflow).
要想添加元素,请用push_back成员函数。
(5)erase 删除vector中的元素
这个操作并不是仅仅将已有的元素置为0,而是真正的删除它,会缩短vector的长度。
vector::erase()方法有两种重载形式
如下:
iterator erase( iterator _Where); iterator erase( iterator _First, iterator _Last);如果是删除指定位置的元素时:
返回值是一个迭代器,指向删除元素下一个元素;
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
示例:
ivec.push_back(0); ivec.push_back(1); ivec.push_back(2); ivec.push_back(2); ivec.push_back(2); ivec.push_back(3); ivec.push_back(4); cout << "before: ivec.size " << ivec.size() << endl; for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++) { cout << *iter << endl; } vector<int>::iterator iter2 = ivec.begin() + 2;//改变长度之前的迭代器 cout << "*iter2 = " << *iter2 << endl; //删除 for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ) { if (*iter == 2) { iter = ivec.erase(iter);//删除后返回下一个位置 } else { iter++; } } cout << "after: ivec.size " << ivec.size() << endl;
5,备注
const vector<int> ivect(6);定义了一个const vector。这代表了两个含义:
1,该vector的元素是const的,所以里面的值不能修改。
ivect[0] = 3; //error C3892: “iVec2”: 不能给常量赋值2,该vector本身是const的,所以其大小不能改变,任何改变其大小的操作都不能实现。
iVec2.push_back(7);//不能将“this”指针从“const std::vector<_Ty>”转换为“std::vector<_Ty> &”
对于
vector<const int> ivect(6);在visual studio下可以编译通过,但是并不限制对其元素的修改,所以和普通的vector并无区别;
在g++下根本无法编译通过。
所以结论是:不要使用这种表达方式。
相关文章推荐
- C++的64位整数
- C++学习笔记6——string
- C++学习笔记5——引用
- C++学习笔记4——const
- C++学习笔记3——变量
- c语言中static作用的简单概述
- C++中变量存储类型
- C++学习笔记2——浮点型与字面值
- C++学习笔记1——iostream与整型
- C语言入门之输入输出
- c++封装socket
- c++ && Java
- C++文件流public function—eof()
- C语言:编写一个程序,它从标准输入(终端)读取C源代码,并验证所有的花括号都正确的成对出现
- C语言:求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222
- C语言:模拟输入密码系统,三次以内正常通过,三次退出程序
- C语言:每隔一秒,动态首尾依次输出一个字符,直到全部输出
- c/c++处理参数
- Emacs 24.4 配置C++智能提示
- C语言:typedef struct与指针