欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ vector容器使用

程序员文章站 2024-03-17 23:45:52
...


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

构造vector对象

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

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

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;

数组下标

 for (int i = 0; i < nums.size(); i++)
  {          
  	tmp[nums[i]] = i;
  }

参考

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

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

相关标签: vector C++