上一篇文章介绍string的用法
本篇和大家分享一下vector的使用
- Vector概念
向量是表示可以改变大小的数组的序列容器。
就像数组一样,向量为其元素使用连续的存储位置,这意味着它们的元素也可以使用指向其元素的常规指针的偏移量来访问,并且与在数组中一样有效。但是与数组不同的是,它们的大小可以动态变化,容器可以自动处理它们的存储。
在内部,向量使用动态分配的数组来存储它们的元素。这个数组可能需要重新分配,以便在插入新元素时增加大小,这意味着分配一个新数组并将所有元素移动到它。就处理时间而言,这是一个相对昂贵的任务,因此,向量不会在每次向容器添加元素时重新分配。
相反,vector容器可能会分配一些额外的存储空间来适应可能的增长,因此容器的实际容量可能比包含其元素(即它的大小)。库可以实现增长不同的策略来平衡内存使用和重新分配,但在任何情况下,重新分配应该只发生在对数生长间隔的大小,以便插入单个元素的向量可以提供平摊常数时间复杂度(见push_back方法)。
因此,与数组相比,向量消耗更多的内存,以换取以有效的方式管理存储和动态增长的能力。
与其他动态序列容器(deques、list和forward_lists)相比,vector访问它的元素(就像数组一样)非常高效,并且相对高效地从它的末端添加或删除元素。对于涉及在末端以外的位置插入或删除元素的操作,它们的性能比其他操作更差,并且具有比列表和转发列表更不一致的迭代器和引用。
| 成员函数 | 作用 |
|---|---|
| assign() | 赋值函数 |
| at() | 传回索引idx所指的数据,如果idx越界,抛出out_of_range |
| back() | 传回最后一个数据,不检查这个数据是否存在。 |
| begin() | 传回迭代器重的可一个数据。 |
| capacity() | 返回容器中数据个数。 |
| clear() | 移除容器中所有数据。 |
| empty() | 判断容器是否为空。 |
| end() | 指向迭代器中的最后一个数据地址 |
| empty() | 删除pos位置的数据,传回下一个数据的位置 |
| front() | 返回第一个数据。 |
| insert() | 插入数据 |
| max_size() | 返回容器中最大数据的数量。 |
| resize() | 重新指定队列的长度。 |
| size() | 返回容器中实际数据的个数。 |
| swap() | 交换数据 |
- assign()函数使用
// vector assign
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> first;
std::vector<int> second;
std::vector<int> third;
first.assign (7,100); // 7 ints with a value of 100
std::vector<int>::iterator it;
it=first.begin()+1;
second.assign (it,first.end()-1); // the 5 central values of first
int myints[] = {1776,7,4};
third.assign (myints,myints+3); // assigning from array.
std::cout << "Size of first: " << int (first.size()) << '\n';
std::cout << "Size of second: " << int (second.size()) << '\n';
std::cout << "Size of third: " << int (third.size()) << '\n';
return 0;
}
结果:
Size of first: 7
Size of second: 5
Size of third: 3
- at()函数使用(比[]更安全)
// 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;
}
结果:
myvector contains: 0 1 2 3 4 5 6 7 8 9
- push_back()函数,添加元素
// vector::back
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
myvector.push_back(10);
while (myvector.back() != 0)
{
myvector.push_back ( myvector.back() -1 );
}
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size() ; i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
结果:
myvector contains: 10 9 8 7 6 5 4 3 2 1 0
- pop_back()函数
// vector::pop_back
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
int sum (0);
myvector.push_back (100);
myvector.push_back (200);
myvector.push_back (300);
while (!myvector.empty())
{
sum+=myvector.back();
myvector.pop_back();
}
std::cout << "The elements of myvector add up to " << sum << '\n';
return 0;
}
结果:
The elements of myvector add up to 600
- 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;
}
结果:
foo contains: 200 200 200 200 200
bar contains: 100 100 100
- insert()函数
// 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';
return 0;
}
结果:
myvector contains: 501 502 503 300 300 400 400 200 100 100 100
- max_size()函数
// comparing size, capacity and max_size
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some content in the vector:
for (int i=0; i<100; i++) myvector.push_back(i);
std::cout << "size: " << myvector.size() << "\n";
std::cout << "capacity: " << myvector.capacity() << "\n";
std::cout << "max_size: " << myvector.max_size() << "\n";
return 0;
}
结果:
size: 100
capacity: 128
max_size: 1073741823
- erase()函数
// erasing from vector
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some values (from 1 to 10)
for (int i=1; i<=10; i++) myvector.push_back(i);
// erase the 6th element
myvector.erase (myvector.begin()+5);
// erase the first 3 elements:
myvector.erase (myvector.begin(),myvector.begin()+3);
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); ++i)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
结果:
myvector contains: 4 5 7 8 9 10