C++ Primer <从入门到放弃> 第3章 vector&迭代器

C++ Primer <从入门到放弃> 第3章 vector&迭代器

第三章字符串向量和数组 [标准库类型vector&迭代器]


标准库类型vector:
vector表示对象的集合,集合对每个对象都有对应的索引,也被称作容器(container),想用使用vector必须包含特定的头文件。


#include<vector>;
using std::vector;
vector<int> ivec;             //ivec 保存int类型对象
vector<Sales_item> Sales_vec  //保存Sales_item类型对象
//初始化对象的方法
vector<T> v1;        //空vetor
vector<T> v2(v1);    //v2包含v1所有元素副本
vector<T> v2 = v1;
vector<T> v3(n,val); //v3包含了n个重复的元素的val值
vector<T> v4 = {a,b,c...} //每个元素的的初始值初始化



如果使用圆括号是构造(construct)vector对象,如果是用花括号则是列表初始化(list initialize)vector对象。

向vector对象中添加元素:
使用成员函数push_back,向vector元素中添加元素。


vector<int> v1;
for(int i = 0;i != 100; ++i)
{
 v1.push_back(i);
}


其他vector操作:

|vector操作 |
|:--------: |
|v.empty() |
|v.push_back(t)|
|v1==v2 |
|v[n] |


vector<int> v{1,2,3,4,5,6,7,8};
for(auto &i : v)
{
  i*=i;
}



通过索引访问vector元素,必须保证索引在合理范围内,否则会导致出现buffer overflow。确保索引合法的方法就是尽可能使用for语句。

使用迭代器:
除了用下标索引可以访问string字符或者vector对象元素我们还可以使用迭代器(iterator)。迭代器都有名为begin和end的成员,begin返回第一元素
迭代器。


auto b = v.begin(),e = v.end();
// e指向尾元素的下一个位置,是一个容器不存在的尾后(off the end)。



|迭代器运算符 |
|:--------: |
|*iter |
|iter->mem |
|++iter |
|iter1!=iter2|


// 当前的字符串首字母改为大写
string s("some string");
if(s.begin!=s.end())
{
  auto it = s.begin()
  *it = toupper(*it);
}



将迭代器从一个元素移动到另一个元素只需要使用"++"运算符。


//将some变为大写
for(auto it = s.begin();it != s.end() && !isspace(*it);++it)
{
  *it = toupper(*it);
}



迭代器类型:


vector<int>::iterator it;        //  读写vector<int>的类型
vector<int>::const_iterator it2; //  只读vector<i>的类型



c++11 提供了cbegin 和 cend 返回const_iterator类型迭代器。

解引用与成员访问操作符:
检查迭代器it所指向的字符串对象是否为空。


(*it).empty(); // 解引用it然后调用empty成员。
*it.empty();   // 错误迭代器对象没有empty成员。
it -> empty(); // C++ 箭头运算符用于解引用。



使用迭代器运算:
使用迭代器运算进行二分搜索。


// test是有序的
auto beg =text.begin(),end = text.end();
auto middle = text.begin()+(end - beg)/2;
while(mid != end && *mid != sought)
{
  if(sought < *mid)
    end = mid;
  else
    beg = mid +1;
  mid = beg + (end - bed)/2;
}
禽兽一只:《C++ Primer》从入门到放弃zhuanlan.zhihu.com图标

发布于 2018-05-31