C++ vector使用

vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。

构造vector对象

vector 是C++ STL的一个重要成员,使用它时需要包含头文件: #include<vector>


vector<int> a;           //无参数 - 构造一个空的vector,
vector<int> a(10);       //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
vector<int> a(10,1);     //定义了10个整型元素的向量,且给出每个元素的初值为1
vector<int> a(b);        //用b向量来创建a向量,整体复制性赋值, 拷贝构造
vector<int> v3=a ;       //移动构造
vector<int> a(b.begin(),b.begin+3);   //定义了a值为b中第0个到第2个(共3个)元素
int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+6);    //从数组中获得初值,b[0]~b[5]

基本操作-属性获取/调整

1 vec.empty-判断vec是否为空

a.empty()

2 vec.size-元素的个数

a.size()

3 vec.capacity-实际存储空间

a.capacity()

4 vec.resize-调整大小

a.resize(10);        //将a的现有元素个数调至10个,多则删,少则补,其值随机
a.resize(10, 2);      //将a的现有元素个数调至10个,多则删,少则补,其值为2

5 vec.reserve-重新分配空间

a.reserve(100);      //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能),但是最大值不可以大于max_size的值,否则会抛出异常

6 比较操作符

a==b;     //b为向量,向量的比较操作还有!=,>=,<=,>,<

基本操作-增加元素

1 vec.push_back()-尾部插入元素

在容器的最后一个位置插入元素x,如果size值大于capacity值,则将重新分配空间

函数:

void push_back (const value_type& val);
void push_back (value_type&& val);
// vector::push_back
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  int myint;

  std::cout << "Please enter some integers (enter 0 to end):\n";

  do {
    std::cin >> myint;
    myvector.push_back (myint);
  } while (myint);

  std::cout << "myvector stores " << int(myvector.size()) << " numbers.\n";

  return 0;
}

2 vec.insert()-插入元素

第一个函数,在迭代器指定的位置前插入值为x的元素

第二个函数,在迭代器指定的位置前插入n个值为x的元素

第三个函数,在迭代器指定的位置前插入另外一个容器的一段序列迭代器first到last

若插入新的元素后总得元素个数大于capacity,则重新分配空间

a.insert(a.begin()+1, 5);         //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
a.insert(a.begin()+1, 3,5);       //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
a.insert(a.begin()+1,b+3, b+6);   //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
// inserting into a vector
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> myvector(3, 100);
    std::vector<int>::iterator it;

    it = myvector.begin();
    it = myvector.insert(it, 200);

    myvector.insert(it, 2, 300);

    // "it" no longer valid, get a new one:
    it = myvector.begin();

    std::vector<int> anothervector(2, 400);
    myvector.insert(it + 2, anothervector.begin(), anothervector.end());

    int myarray[] = { 501,502,503 };
    myvector.insert(myvector.begin(), myarray, myarray + 3);

    std::cout << "myvector contains:";
    for (it = myvector.begin(); it < myvector.end(); it++)
        std::cout << ' ' << *it;
    std::cout << '\n';

    system("PAUSE");
    return 0;
}

基本操作-删除元素

1 vec.erase-删除

iterator erase (const_iterator position);//删除指定位置元素,返回迭代器
//例如:a.erase(a.begin()+1)

iterator erase (const_iterator first, const_iterator last);//删除指定迭代器中间的元素,左闭右开
//例如:a.erase(a.begin()+1, a.begin()+3);

2 vec.clear-清空vec中的元素

将容器里的内容清空,size值为0,但是存储空间没有改变

a.clear();

3 vec.pop_back-删除尾部元素

a.pop_back();         //删除a向量的最后一个元素

基本操作-查找/修改元素

1 vec.assign-重新赋值

将丢弃原来的元素然后重新分配元素,第一个函数是使用迭代器,第二个函数是使用4个元素,每个元素的值为2

a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
a.assign(4,2);        //是a只含4个元素,且每个元素为2

2 vec.back-返回vec的最后一个元素

返回尾部元素的值,与end()函数有区别,back()函数返回的是尾部元素的迭代器

vec.back()

3 vec.front-返回vec的第一个元素

返回第一个元素的值,与begin()函数有区别,begin()函数返回的是第一个元素的迭代器

vec.front()

4 vec[i]-下标访问修改

// vector::operator[]
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (10);   // 10 zero-initialized elements

  std::vector<int>::size_type sz = myvector.size();

  // assign some values:
  for (unsigned i=0; i<sz; i++) myvector[i]=i;

  // reverse vector using operator[]:
  for (unsigned i=0; i<sz/2; i++)
  {
    int temp;
    temp = myvector[sz-1-i];
    myvector[sz-1-i]=myvector[i];
    myvector[i]=temp;
  }

  std::cout << "myvector contains:";
  for (unsigned i=0; i<sz; i++)
    std::cout << ' ' << myvector[i];
  std::cout << '\n';

  return 0;
}

5 at-访问元素

在函数的操作方面和下标访问元素一样,不同的是当这个函数越界时会抛出一个异常out_of_range

// vector::at
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (10);   // 10 zero-initialized ints

  // assign some values:
  for (unsigned i=0; i<myvector.size(); i++)
    myvector.at(i)=i;

  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); i++)
    std::cout << ' ' << myvector.at(i);
  std::cout << '\n';

  return 0;
}

6 swap-交换

交换这两个容器的内容,这涉及到存储空间的重新分配

// swap vectors
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> foo (3,100);   // three ints with a value of 100
  std::vector<int> bar (5,200);   // five ints with a value of 200

  foo.swap(bar);

  std::cout << "foo contains:";
  for (unsigned i=0; i<foo.size(); i++)
    std::cout << ' ' << foo[i];
  std::cout << '\n';

  std::cout << "bar contains:";
  for (unsigned i=0; i<bar.size(); i++)
    std::cout << ' ' << bar[i];
  std::cout << '\n';

  return 0;
}

基本操作-迭代器

1 vec.begin/vec.end-迭代器

// vector::begin/end
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  for (int i=1; i<=5; i++) myvector.push_back(i);

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

2 vec.cbegin/vec.cend-常量迭代器

返回一个类型为cont::const_iterator 的对象


// vector::cbegin/cend
#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30,40,50};

  std::cout << "myvector contains:";

  for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

算法操作

需要头文件#include<algorithm>

1 sort-排序

sort(a.begin(),a.end());     //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列

2 reverse-翻转

使用reverse将元素翻转

reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1

3 copy-复制

copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开        始复制,覆盖掉原有元素

4 find-查找

find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

常用操作

使用迭代器遍历容器

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++){
vec[it]=0;
}

auto遍历

for (auto& x : vec)
        std::cout << ' ' << x;

参考

http://www.cplusplus.com/reference/vector/vector/

https://blog.csdn.net/happy987818/article/details/54944132

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,554评论 1 51
  • 容器 在实际的开发过程中, 数据结构本身的重要性不会逊于操作于数据结构的算法的重要性, 当程序中存在着对时间要求很...
    编程小兔崽阅读 1,129评论 0 1
  • 标签(空格分隔): STL 运用STL,可以充分利用该库的设计,让我为简单而直接的问题设计出简单而直接的解决方案,...
    认真学计算机阅读 1,521评论 0 10
  • 是曾经相见过 在茫茫的人海中 在寂静的村野外 也许只是在擦肩而过的回眸里 我们在烟雨的城市里相遇过 你举眉轻笑走...
    秦南子阅读 501评论 0 51
  • 你是一条小河 静静的从我身边流过 我无意间的一瞥 揉进了你的微波 是什么让你回旋婉转 又是什么使我身影婆娑 本来闲...
    四字真言阅读 487评论 2 4