C++ 标准库类型 vector
一、vector 的使用与定义
1、使用 vector 类型
标准库类型 vector 表示对象的集合,也称容器。
#include <vector >
using std::vector ;
2、定义和初始化 vector 对象
- vector 是类模板,实例化时必须指定类型。
- 可以嵌套定义,如vector < vector < int > >
构造初始化:使用(),数字表示元素个数。
列表初始化:使用{ },数字表示元素。列表中的元素必须是相同类型,否则尝试转化为构造初始化。
// v1 有10个元素,使用默认初始化=0
vector<int> v1(10);
// v1 有1个元素10
vector<int> v2{10};
二、vector 对象操作
1、 vector 对象添加元素
如果 vector 的元素无法确定或者元素太多,一般先声名一个空的 vector,然后使用 push_back 添加元素。
// 循环读入,存放在 vector 中
string word;
vector<string> text;
while(cin >> word)
{
text.push_back(word);
}
// 创建一个包含0~99的vector
vector<int> v1;
for(int i = 0; i!= 100; ++i)
v1.push_back(i)
2、 vector 对象其它操作
比较,下标操作与string类型类似,注意:
- 不能使用下标添加元素,因为该下标还不存在。
- 不能访问越界的下标。
// 统计不同分数段的人数
vector<unsigned> scores(11, 0);
unsigned grade;
while(cin >> grade)
{
if(grad <= 100)
++scores[grade/10];
}
三、vector 算法分析
1、实现
vector 是可增长的数组实现,内部一数组的方式存储
- 各种操作的实现和数组类似
- 在需要时可以使数组的容量成倍增长,实现动态数组
2、时间复杂度
- 查找:O(1)
- 普通插入:O(N)
- push_back:O(1)
- 普通删除:O(N)
- pop_back:O(1)
四、迭代器
1、使用迭代器
迭代器成员:
- begin():返回容器的第一个元素
- end():返回容器的尾元素的下一个位置,称为“尾后迭代器”
声名定义迭代器
auto b = v.begin();
auto e = v.end();
// 使用迭代器把第一个单词改为大写
string s("xxx")
for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it)
*it = toupper(*it);
迭代器的类型
- iterator:可读写的迭代器
- const_iterator:只能读的迭代器,称为常迭代器
vector<int> v;
const vector<int> cv;
// it1 为 vector<int>::iterator 类型
auto it1 = v.begin();
// it2 为 vector<int>::const_iterator 类型
auto it2 = cv.begin();
为了便于得到 const_iterator 类型的返回值,可用下面两个成员:
- cbegin():const 的 begin() 只能读取
- cend():const 的 end() 只能读取
2、迭代器的运算
- (*it).empty() 的括号不能少,可用it->empty() 代替
- 使用迭代器的循环体,不要向该容器添加元素
使用迭代器完成二分搜索:
// 要搜索的数
int num = xx;
// 待搜索的 vector
vector<int> text{xx, xx}
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;
while(mid != end && *mid != num)
{
if(num < *mid)
end = mid;
else
beg = mid + 1;
mid = beg + (end - beg)/2;
}