vector容器类的简单入门

vector容器类型
   vector容器模板类存放任何类型对象(必须类对象)vector对象运行时高效地添加元素并且vector元素连续存储
vector构造
 
函数原型:
template<typename T>
   explicit vector();                                 // 默认构造函数vector对象空
   explicit vector(size_type n, const T& v = T());    // 创建有n元素vector对象
   vector(const vector& x);
   vector(const_iterator first, const_iterator last);

注:vector容器内存放所有对象都经过初始化没有指定存储对象初始值对于内置类型用0初始化对于类类型调用其默认构造函数进行初始化(有其构造函数而没有默认构造函数此时必须提供元素初始值才能放入容器
 
举例:
vector<string> v1;         // 创建空容器其对象类型string类
vector<string> v2(10);     // 创建有10具有初始值(即空串)string类对象容器
vector<string> v3(5, "hello"); // 创建有5hellostring类对象容器
vector<string> v4(v3.begin(), v3.end());  // v4与v3相同容器(完全复制)
 
vector操作(下面函数都成员函数)
 
bool empty() const;                    // 容器返回true;否则返回false
size_type max_size() const;            // 返回容器能容纳大元素数
size_type size() const;                // 返回容器元素数  
size_type capacity() const;            // 容器能够存储元素有:capacity() >= size()  
void reserve(size_type n);             // 确保capacity() >= n
void resize(size_type n, T x = T());   // 确保返回有:size() == n;之前size()<n用元素x值补全
 
reference front();                     // 返回容器元素引用(容器必须非空)
const_reference front() const;                   
reference back();                      // 返回容器元素引用(容器必须非空)
const_reference back() const;
 
reference operator[](size_type pos);   // 返回下标pos元素引用(下标从0开始;下标正确则属于未定义行
const_reference operator[](size_type pos) const; 
reference at(size_type pos);           // 返回下标pos元素引用;下标正确则抛出异常out_of_range
const_reference at(size_type pos) const;
            
void push_back(const T& x);            // 向容器末尾添加元素          
void pop_back();                       // 弹出容器元素(容器必须非空)
 
// 注:下面插入和删除操作发生元素移动(了保持连续存储性质)之前迭代器能失效
iterator insert(iterator it, const T& x = T());        // 插入点元素之前插入元素(或者说插入点插入元素)
void insert(iterator it, size_type n, const T& x);     // 注意迭代器再有效(能重新分配空间)
void insert(iterator it, const_iterator first, const_iterator last);
 
iterator erase(iterator it);           // 删除指定元素并返回删除元素元素位置(无元素返回end())
iterator erase(iterator first, iterator last); // 注意:删除元素删除点之元素对应迭代器再有效
 
void clear() const;                    // 清空容器相当于调用erase( begin(), end())
 
void assign(size_type n, const T& x = T());   // 赋值用指定元素序列替换容器内所有元素
void assign(const_iterator first, const_iterator last);
 
const_iterator begin() const;          // 迭代序列
iterator begin();
const_iterator end() const;
iterator end();
 
const_reverse_iterator rbegin() const;
reverse_iterator rbegin();
const_reverse_iterator rend() const; 
reverse_iterator rend();
 
vector对象比较(非成员函数)
 
   针对vector对象比较有六比较运算符:operator==、operator!=、operator<、operator<=、operator>、operator>=对于operator==和operator!=vector对象拥有相同元素并且对应位置元素全部相等则两vector对象相等;否则
   对于operator<、operator<=、operator>、operator>=采用字典排序策略比较

注:其实只需要实现operator==和operator!=根据实现operator!= (lhs, rhs)  !(lhs == rhs)operator<=(lhs, rhs)  !(rhs < lhs)operator>(lhs, rhs)  (rhs < lhs)operator>=(lhs, rhs)  !(lhs, rhs)
 
vector类迭代器

   vector类迭代器除了支持通用前缀自增运算符外还支持算术运算:it + n、it - n、it2 - it1注意it2 - it1返回值difference_type(signed类型)
 
   注意任何改变容器大小操作都能造成迭代器失效
 
应用示例
 
#include <iostream>
#include <cassert>
#include <vector>

using namespace std;

int main()
{
    vector<string> v(5, "hello");
    vector<string> v2(v.begin(), v.end());
    
    assert(v == v2);
    
    cout<<"> Before operation"<<endl;
    for(vector<string>::const_iterator it = v.begin(); it < v.end(); ++it)
        cout<<*it<<endl;
    
    v.insert(v.begin() + 3, 4, "hello, world");
    cout<<"> After insert"<<endl;
    for(vector<string>::size_type i = 0; i < v.size(); ++i)
        cout<<v[i]<<endl;
    
    vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6);
    assert(*it == "hello, world");
    cout<<"> After erase"<<endl;
    for(vector<string>::size_type i = 0; i != v.size(); ++i)
        cout<<v[i]<<endl;
    
    assert(v.begin() + v.size() == v.end());
    assert(v.end() - v.size() == v.begin());
    assert(v.begin() - v.end() == -vector<string>::difference_type(v.size()));
    
    return 0;
}
程序说明:上面程序用了三循环输出容器元素循环遍历方式特别需要说明第二循环条件判断使用了size() 函数循环之前先保存变量再使用之所样做有两原因:其修改程序时循环修改了容器元素循环仍好 地工作先保存size()函数值正确了;其二由于些小函数(其实现只需要条返回语句)基本上都被声明inline需要考虑效率问题
转自百度知道~
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页