C++ 标准库类型 vector

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值