当前位置:首页 > 编程笔记 > 正文
已解决

c++之vector容器

来自网友在路上 159859提问 提问时间:2023-11-02 02:04:58阅读次数: 59

最佳答案 问答题库598位专家为你答疑解惑

1.简介

  向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

1.1 vector和普通数组区别

  普通数组是静态的,在初始化是就确定空间大小,不支持动态扩展;
  vector则可以看做是一个动态的数组,可以存放任意数据(基本数据类型和自定义数据类型均可以),支持动态扩展空间。

2.vector容器的构造函数

  vector容器,可以看做是一个单端数组,构造函数有:无参构造、有参构造、拷贝构造。

vector 容器:—>单端数组

  • vector和普通数组的区别:
    普通数组是静态空间,创建是就分配好
    vector支持动态扩展
  • vector容器常用迭代器:
    v.rend() -->指向第一个元素的前一个位置
    v.end() -->指向最后一个元素的下一个位置
    v.begin() -->指向第一个元素
  • vector容器的迭代器是支持随机访问的迭代器
  • vector构造函数:
    无参构造:vector< T > v;
    有参构造:vector(v.begin(),b.end()); --将begin到end之间的内容拷贝
         vector(n,elem); //将n个elem内容拷贝
    拷贝构造:vector(const vector &v);
  • vector构造函数使用示例:
#include < iostream >
using namespace std;
#include < vector >
void PrintVector(const vector< int >& ptr)
{//若传入的vector是一个常量,则才是需要迭代器是需要使用:const_iteratorfor ( vector< int >:: const_iterator v = ptr.begin(); v != ptr.end(); v++){cout << *v << " ";} cout << endl;
}
void test()
{vector< int > vtr;//默认构造for (int i = 0; i < 5; i++){vtr.push_back(i);}PrintVector(vtr);vector< int > v2(vtr.begin(), vtr.end());//将begin~end之间的内容拷贝PrintVector(v2);vector< int > v3(10, 5);//赋值10个5PrintVector(v3);vector< int >v4(v3);//拷贝构造PrintVector(v4);
}
int main()
{test();system("pause");
}

在这里插入图片描述

3.vector赋值

  vector赋值可以直接"="赋值,也可以使用成员函数assign赋值。


vector赋值:vector &operator=(const vector &v);//重载=assign(beg,end);//将beg~end区间进行赋值assign(n,elem);//n个elem赋值
  • 赋值操作示例:
#include < iostream >
using namespace std;
#include < vector >void PrintVector(const vector< int >& p)
{for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++){cout << *ptr<< " ";	}cout << endl;
}
void test()
{vector< int > v;for (int i = 0; i < 5; i++){v.push_back(i);}PrintVector(v);vector< int > v2 = v;//等号赋值PrintVector(v2);vector< int > v3(v.begin(), v.end());//区间赋值PrintVector(v3);vector< int > v4(5, 666);//5个666赋值PrintVector(v4);
}
int main()
{test();system("pause");
}

在这里插入图片描述

4.vector获取容量和成员个数

  vector和普通数组一样,下标是从0开始的。获取容量大小使用capacity()函数,判断容器是否为空可以使用empty()函数,获取成员个数使用size()函数。还可以使用resize函数指定容器大小;

vector容器的容量和成员个数:
判断vector容器是否为空:empty()
容量:capacity()
容器中的元素个数:size()
指定容器长度为num:resize(int num);若容器变长,则以默认值填充,默认值为0若容器变小,则末尾超出的元素将被删除
指向容器的长度为num:resize(int num,elem);若容器变长,则用elem填充若容器变小,则末尾超出的元素将被删除
  • 使用示例:
#include < iostream >
using namespace std;
#include < vector >
void PrintVector(const vector< int >& p)
{for (vector< int >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++){cout << *ptr << " ";}cout << endl;cout << "容量:" << p.capacity();cout << endl;cout << "元素个数:" << p.size();cout << endl;
}
void test()
{vector< int > vtr;for (int i = 0; i < 5; i++){vtr.push_back(i);}PrintVector(vtr);//指定容器长度vtr.resize(10,666);//指定长度为10,超出则用666填充PrintVector(vtr);vtr.resize(3);//指定长度小于实际长度,则会删除超出的元素,但空间超出的空间还是存在PrintVector(vtr);vector< int >v2;v2.resize(5);//没有指定填充值则默认为0if (v2.empty()){cout << "v2为空" << endl;}PrintVector(v2);
}
int main()
{test();system("pause");
}

在这里插入图片描述
  注意:在resize()函数时,若指定的大小比原空间大,则容器会进行扩充;若指定的大小比原空间小,则会将超出的成员删除,但空间大小不删除;

5.vector容器成员删除与插入

vector容器是一个单端数组,通过bush_back()函数可以实现从末尾插入数据。
pop_back()从末尾删除数据;
从指定位置插入数据可以使用insert()成员函数,该函数有多个重载版本。
要从指定位置删除数据可以使用erase()成员函数,该函数有多个重载版本;
clear()函数实现清空容器。

vector插入与删除:push_back();//尾插pop_back();//尾删insert(const_iterator pos,elem);//迭代器指向位置pos插入元素eleminsert(const_iterator pos,int count,elem)//迭代器指向位置pos插入count个元素elemerase(const_iterator pos);//删除迭代器指向的元素erase(const_iterator start,const_iterator end);//删除迭代器start~end之间的元素clear();//删除容器中所有元素
  • 实现示例:
#include < iostream >
using namespace std;
#include < vector >
class Person
{friend ostream& operator<<(ostream& cout, const Person& per);
public:Person() {}Person(int age, string name) :age(age), name(name){}Person& operator=(Person p){this- >age = p.age;this->name = p.name;return *this;}
private:int age;string name;
};
ostream& operator< <(ostream& cout, const Person &per)
{cout << "姓名:" << per.name << "t年龄:" << per.age;return cout;
}
void PrintVector(const vector< Person >& p)
{for (vector< Person >::const_iterator ptr = p.begin(); ptr != p.end(); ptr++){cout << *ptr << endl;}
}
void test()
{//实例化对象Person v1(18,"小王");Person v2(18, "小李");Person v3(18, "小刘");Person v4(18, "小陈");Person v5(18, "小蒋");Person v[5] = { v1,v2,v3,v4,v5 };for (int i = 0; i < sizeof(v) / sizeof(v[0]); i++){cout < < v[i] < < endl;}cout << "--------------------vector-------------------" << endl;//创建容器vector< Person > vtr;//尾插for (int i = 0; i < 5; i++){vtr.push_back(v[i]);//赋值}PrintVector(vtr);//尾删cout << "t尾删" << endl;vtr.pop_back();PrintVector(vtr);//插入cout << "t插入" << endl;Person temp(24, "老吕");vtr.insert(vtr.begin(), temp);PrintVector(vtr);cout << "t第三个位置插入3个值" << endl;vector< Person >::iterator ptr = vtr.begin();ptr += 3;vtr.insert(ptr, 3,temp);PrintVector(vtr);cout << "t删除首位置的值" << endl;vtr.erase(vtr.begin());PrintVector(vtr);cout << "t删除第3个位置到第6个位置的值" << endl;ptr = vtr.begin();vtr.erase(ptr+3, ptr+6);PrintVector(vtr);cout << "t清空" << endl;vtr.clear();//或者使用vtr.erase(vtr.begin(),vtr.end);PrintVector(vtr);cout << "空间大小:" << vtr.capacity();cout << endl;cout << "元素个数:" << vtr.size();cout << endl;
}
int main()
{test();system("pause");
}

在这里插入图片描述

6.vector容器数据存取

  vector容器也可以像普通数组一样同[]访问成员,此外还可以使用at()成员函数实现数据读写;


vector数据存取at(int idx);//返回下标对应的内容operator[];//重载[]front();//返回容器中第一个元素back();//返回容器中最后一个元素
  • 实现示例:
#include < iostream >
using namespace std;
#include < vector >
#include < algorithm >void PrintVector(int val)
{cout << val << " ";
}
void test()
{vector<int> vtr;for (int i = 0; i < 5; i++){vtr.push_back(i);}for_each(vtr.begin(), vtr.end(), PrintVector);cout << endl;cout << "第一个值:" << vtr.front() << endl;cout << "最后一个值:" << vtr.back() << endl;vtr[0] = 100;cout << "vtr[0]=" << vtr.at(0) < < endl;}int main()
{test();system("pause");
}

在这里插入图片描述

7.vector容器互换元素

  在vector容器中,可以通过成员函数swap()函数实现两个容器的成员互换。
  注意:swap互换元素同时也可将空间大小进行互换。


vector容器互换
swap(vec);//将vec中的元素和本身的元素互换
注意:swap互换元素同时也可将空间大小进行互换
  • 使用示例:
#include < iostream >
#include < vector >
using namespace std;
void PrintVector(const vector<int>& p)
{for (vector<int>::const_iterator ptr = p.begin(); ptr != p.end(); ptr++){cout << *ptr << " ";}cout << endl;
}
void test()
{vector<int> vtr(10,666);vector<int> vtr2;for (int i = 0; i < 5; i++){vtr2.push_back(i);}cout << "\t互换前" << endl;PrintVector(vtr);PrintVector(vtr2);cout << "vtr大小:" << vtr.capacity() << "\t元素个数:"<<vtr.size()<<endl;cout << "vtr2大小:" << vtr2.capacity() << "\t元素个数:" << vtr2.size()<<endl;cout << "\t互换后" << endl;vtr2.swap(vtr);PrintVector(vtr);PrintVector(vtr2);cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;cout << "vtr2大小:" << vtr2.capacity() << "\t元素个数:" << vtr2.size() << endl;
}
//通过swap互换元素同时互换空间
void test02()
{vector<int>vtr;//初始化for (int i = 0; i < 100000; i++){vtr.push_back(i);}cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;vtr.resize(5);//重新指定长度为5cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;vector<int>(vtr).swap(vtr);/*vector<int>(vtr) --使用匿名对象,将匿名对象初始化为vtrvector<int>(vtr).swap(vtr);  --在通过swap函数和匿名对象互换,此时即可实现收缩内存*/cout << "vtr大小:" << vtr.capacity() << "\t元素个数:" << vtr.size() << endl;
}
int main()
{test();cout << "------------------test02示例------------------------" << endl;test02();system("pause");
}

在这里插入图片描述
  由于swap函数不仅可以互换元素,而且空间也大小也是可以互换的,所以有些清空下可以使用swap()函数来合理使用空间,避免空间资源浪费。

8.vector容器预留空间

reserve()成员函数可以指定空间大小,为vector容器预留空间。
reserve函数和resize()函数区别:
resize()函数指定大小后会直接初始化空间;
reserve()函数指定的大小不会初始化空间,预留的空间不能直接访问,必须在赋值之后采用访问。
reserve(int len);//容器预留len长度的元素,预留位置初始化,元素不可访问
  • 使用示例:
#include < iostream >
using namespace std;
#include < vector >
void test()
{vector<int>vtr;vtr.reserve(10);cout << "空间大小:" << vtr.capacity() << "元素个数:"<<vtr.size()<<endl;vector<int> vtr2;vtr2.resize(10);//指定长度cout << "空间大小:" << vtr2.capacity() << "元素个数:" << vtr2.size() << endl;
}void test02()
{vector<int> vtr;int* p=NULL;cout << "不适用预留空间:" << endl;int num = 0;for (int i = 0; i < 100000; i++){vtr.push_back(i);if (p != &vtr[0]){p = &vtr[0];num++;}}cout << "动态扩展空间次数:" << num<<endl;vector<int> vtr2;vtr2.reserve(100000);//预留100000空间p = NULL;cout << "使用预留空间:" << endl;num = 0;for (int i = 0; i < 100000; i++){vtr2.push_back(i);if (p != &vtr2[0]){p = &vtr2[0];num++;}}cout << "动态扩展空间次数:" << num << endl;}
int main()
{test();cout << "\t示例2:" << endl;test02();system("pause");
}

在这里插入图片描述
  vector容器空间是根据成员来动态扩展,若一开始就知道使用的空间大概需要多大,则可以使用reserve()函数来指定,从而可以减少中间动态扩展的次数。

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"c++之vector容器":http://eshow365.cn/6-29804-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!