VC中vector用法
vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
简单的使用方法如下:
vector<int> test;//建立一个vector
test.pushback(1);//把1和2压入vector 这样test[0]就是1,test[1]就是2
test.pushback(2);
我们可以用一个迭代器:
vector<int>::iterator iter=text.begin();//定义一个可以迭代int型vector的迭代器iter,它指向text的首位,迭代器跟指针差不多
while(;iter!=text.end();iter++) cout<<(*iter);//iter++指的是向前迭代一位,直到iter到超出末端迭代器为止,输出迭代器指向的值
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include <vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
vector<int> vInts;
或者连在一起,使用全名:
std::vector<int> vInts;
建议使用全局的命名域方式:using namespace std;
函数
表述
c.assign(beg,end)c.assign(n,elem)
将[beg; end)区间中的数据赋值给c。将n个elem的拷贝赋值给c。
c.at(idx)
传回索引idx所指的数据,如果idx越界,抛出out_of_range。
c.back()
传回最后一个数据,不检查这个数据是否存在。
c.begin()
传回迭代器中的第一个数据地址。
c.capacity()
返回容器中数据个数。
c.clear()
移除容器中所有数据。
c.empty()
判断容器是否为空。
c.end()
指向迭代器中末端元素的下一个,指向一个不存在元素。
c.erase(pos)
c.erase(beg,end)
删除pos位置的数据,传回下一个数据的位置。
删除[beg,end)区间的数据,传回下一个数据的位置。
c.front()
传回第一个数据。
get_allocator
使用构造函数返回一个拷贝。
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
在pos位置插入一个elem拷贝,传回新数据位置。在pos位置插入n个elem数据。无返回值。在pos位置插入在[beg,end)区间的数据。无返回值。
c.max_size()
返回容器中最大数据的数量。
c.pop_back()
删除最后一个数据。
c.push_back(elem)
在尾部加入一个数据。
c.rbegin()
传回一个逆向队列的第一个数据。
c.rend()
传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num)
重新指定队列的长度。
c.reserve()
保留适当的容量。
c.size()
返回容器中实际数据的个数。
c1.swap(c2)
swap(c1,c2)
将c1和c2元素互换。同上操作。
vector<Elem>
cvector<Elem> c1(c2)
vector <Elem> c(n)
ector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>()
创建一个空的vector。复制一个vector。创建一个vector,含有n个数据,数据均已缺省构造产生。创建一个含有n个elem拷贝的vector。创建一个以[beg;end)区间的vector。销毁所有数据,释放内存。
operator[]
返回容器中指定位置的一个引用
使用两种方法来访问vector。
1、 vector::at()
2、 vector::operator[]
operator[]主要是为了与C语言进行兼容
它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:
分析下面的代码:
vector<int> v;
v.reserve(10);
for(int i=0; i<7; i++) {
v.push_back(i);
}
try {int iVal1 = v[7];
// not bounds checked - will not throw
int iVal2 = v.at(7);
// bounds checked - will throw if out of range
} catch(const exception& e) {
cout << e.what();
}
删除vector中的数据
vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。
Remove_if()算法 如果要使用remove_if(),需要在头文件中包含如下代码::
#include <algorithm>
Remove_if()有三个参数:
1、 iterator _First:指向第一个数据的迭代指针。
2、 iterator _Last:指向最后一个数据的迭代指针。
3、 predicate _Pred:一个可以对迭代操作的条件函数
VC之vector综合运用
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
void main()
{
// create empty vector for strings
vector<string> sentence;
// reserve memory for five Items to avoid reallocation
sentence.reserve(5);
// append some Items
sentence.push_back("Hello,");
sentence.push_back("how");
sentence.push_back("are");
sentence.push_back("you");
sentence.push_back("?");
// assign "!" to the last Item
sentence.back() = "!";
// print Items separated with spaces
copy (sentence.begin(), sentence.end(),
ostream_iterator<string>(cout," "));
cout << endl;
}
//wll print Hello,how are you !
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
int main()
{
char name[] = "abcedfghijklmn";
vector<char> myVector(name, name + 6);
vector<char> myVector2(myVector);
// Uses copy constructor
assert (myVector2 == myVector);
return 0;
}
#include <vector>
#include <iostream>
using namespace std;
long k;
int main()
{
const long N = 600000; // Length of tuples x and y
const long S = 10;
// Sparseness factor
vector<double> x(N), y(N);
for ( k= 0; 3 * k * S < N; ++k)
x[3 * k * S] = 1.0;
for (long k = 0; 5 * k * S < N; ++k)
y[5 * k * S] = 1.0;
double sum = 0.0;
for ( k = 0; k < N; ++k)
sum += x[k] * y[k];
cout << sum << endl;
return 0;
} //4000
#include <iostream>
#include <cassert>
#include <vector>
using namespace std;
class MyClass {
public:
unsigned long id;
unsigned long generation;
static unsigned long total_copies;
MyClass() : id(0), generation(0) { }
MyClass(unsigned long n) : id(n), generation(0) { }
MyClass(const MyClass& z) : id(z.id), generation(z.generation + 1) {
++total_copies;
}
};
bool operator==(const MyClass& x, const MyClass& y)
{
return x.id == y.id;
}
bool operator!=(const MyClass& x, const MyClass& y)
{
return x.id != y.id;
}
unsigned long MyClass::total_copies = 0;
int main()
{
vector<MyClass> vector1, vector2(3);
assert (vector1.size() == 0);
assert (vector2.size() == 3);
assert (vector2[0] == MyClass() && vector2[1] == MyClass() &&
vector2[2] == MyClass());
for (int i = 0; i != 3; ++i)
cout << "vector2[" << i << "].generation: " << vector2[i].generation << endl;
cout << "Total copies: " << MyClass::total_copies << endl;
return 0;
}
|