C++ vector容器使用
程序员文章站
2024-03-17 23:45:52
...
文章目录
- **构造vector对象**
- **基本操作-属性获取/调整**
- 1 vec.empty-判断vec是否为空
- 2 vec.size-元素的个数
- 3 vec.capacity-实际存储空间
- 4 vec.resize-调整大小
- 5 vec.reserve-重新分配空间
- 6 比较操作符
- **基本操作-增加元素**
- **基本操作-删除元素**
- **基本操作-查找/修改元素**
- 1 vec.assign-重新赋值
- 2 vec.back-返回vec的最后一个元素
- 3 vec.front-返回vec的第一个元素
- 4 vec[i]-下标访问修改
- 5 at-访问元素
- 6 swap-交换
- **基本操作-迭代器**
- **算法操作**
- 常用操作
- 参考
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;
}
参考
上一篇: 动态规划求连续子数组的最大和