您的位置:首页 > 编程语言 > C语言/C++

C++ STL:vector和list

2013-09-19 11:42 316 查看

STL 描述:

C++标准模块库是一个提供了公共编程数据结构和函数的模板类集合,如双连接表(list),配对数组(map),可扩展数组(vector),大串的存储操作(rope)等。STL库可以从http://www.sgi.com/tech/stl/ 获取。

STL可以分为以下几类:

容器类:

顺序容器:

vector:动态数组变量,结构体或对象。可以插入在末尾插入数据,支持快速随机访问。
deque: 支持在数组的前面和后面插入元素,双端队列。
list: 基于链表的变量、结构或对象。可以在任何地方插入和删除元素。支持快速插入、删除。

关联容器:

set (不允许有重复元素在set中), multiset (可以有重复元素): 平衡二叉树结构有序的数据的集合,能快速搜索。

map (唯一keys), multimap (允许重复keys): 关联键 - 值对的平衡二叉树结构。

容器适配器:

stack LIFO 栈
queue FIFO 队列
priority_queue 返回最高优先级的元素,优先级队列

字符串:

string:字符串及其操作
rope: 字符串存储和操作

bitset: 直观的存储位和操作位。

泛型算法:

迭代器iterator: 代表容器中的位置,一个迭代器定义为一个容器类类型。
算法algorithm: 提供查找,计数,搜索容器中的元素的类。
智能指针auto_ptr: 关联内存指针避免内存泄露的类。

STL vector:

初始化:
vector<int> ivec;
vector<int > vec2(ivec);
vector c (iter.begin,iter.end);
vecotr<int > c(5,0);
vector<int> c(5);

example 1: 用vector存储STL strings,并且用三种方法类访问vector中的元素:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

main()
{
vector<string> SS;

SS.push_back("The number is 10");
SS.push_back("The number is 20");
SS.push_back("The number is 30");

cout << "Loop by index:" << endl;

int ii;
for(ii=0; ii < SS.size(); ii++) //第一种方法访问
{
cout << SS[ii] << endl;
}

cout << endl << "Constant Iterator:" << endl;

vector<string>::const_iterator cii;
for(cii=SS.begin(); cii!=SS.end(); cii++)//第二种方法
{
cout << *cii << endl;
}

cout << endl << "Reverse Iterator:" << endl;

vector<string>::reverse_iterator rii;
for(rii=SS.rbegin(); rii!=SS.rend(); ++rii)// 第三种方法
{
cout << *rii << endl;
}

cout << endl << "Sample Output:" << endl;

cout << SS.size() << endl;
cout << SS[2] << endl;

swap(SS[0], SS[2]);
cout << SS[2] << endl;
}


用vector来表示二维、三维数组:

一个二维数组是两个vector,vector构造函数可以初始化的数组的长度,并设置初始值。
example 2:vector二维数组

#include <iostream>
#include <vector>

using namespace std;

main()
{
// 声明二维数组的大型并且初始化
vector< vector<int> > vI2Matrix(3, vector<int>(2,0));

vI2Matrix[0][0] = 0;
vI2Matrix[0][1] = 1;
vI2Matrix[1][0] = 10;
vI2Matrix[1][1] = 11;
vI2Matrix[2][0] = 20;
vI2Matrix[2][1] = 21;

cout << "Loop by index:" << endl;

int ii, jj;
for(ii=0; ii < 3; ii++)
{
for(jj=0; jj < 2; jj++)
{
cout << vI2Matrix[ii][jj] << endl;
}
}
}

example 3vector三维数组

#include <iostream>
#include <vector>

using namespace std;

main()
{
// Vector length of 3 initialized to 0
vector<int> vI1Matrix(3,0);

// Vector length of 4 initialized to hold another

// vector vI1Matrix which has been initialized to 0
vector< vector<int> > vI2Matrix(4, vI1Matrix);

// Vector of length 5 containing two dimensional vectors
vector< vector< vector<int> > > vI3Matrix(5, vI2Matrix);

...


或者在一条语句中定义:

#include <iostream>
#include <vector>

using namespace std;

main()
{
vector< vector< vector<int> > > vI3Matrix(2, vector< vector<int> > (3, vector<int>(4,0)) );

for(int kk=0; kk<4; kk++)
{
for(int jj=0; jj<3; jj++)
{
for(int ii=0; ii<2; ii++)
{
cout << vI3Matrix[ii][jj][kk] << endl;
}
}
}
}


使用迭代器:
example 4: 对二维vector使用迭代器

#include <iostream>
#include <vector>

using namespace std;

main()
{
vector< vector<int> > vI2Matrix;    // 声明二维数组
vector<int> A, B;
vector< vector<int> >::iterator iter_ii;
vector<int>::iterator   iter_jj;

A.push_back(10);
A.push_back(20);
A.push_back(30);
B.push_back(100);
B.push_back(200);
B.push_back(300);

vI2Matrix.push_back(A);
vI2Matrix.push_back(B);

cout << endl << "Using Iterator:" << endl;

for(iter_ii=vI2Matrix.begin(); iter_ii!=vI2Matrix.end(); iter_ii++)
{
for(iter_jj=(*iter_ii).begin(); iter_jj!=(*iter_ii).end(); iter_jj++)
{
cout << *iter_jj << endl;
}
}
}


构造函数/声明:

方法/操作描述
vector<T> v;声明一个数据类型为 "T"的vector变量v.
vector<T> v(size_type n);声明一个大小为n,包含数据类型T的vector变量
vector<T> v(size_type n,const T& t);声明一个大小为n,包含数据类型为T,元素的值为t的vector变量

Declaration: vector(size_type n, const T& t)
vector<T> v(begin_iterator,end_iterator);从迭代器开始位置到结束位置拷贝一个vector

Declaration: template vector(InputIterator, InputIterator)
Size 方法/操作:

Method/operatorDescription
empty()Returns bool (true/false). True if empty.

Declaration: bool empty() const
size()Number of elements of vector.

Declaration: size_type size() const
resize(n, t=T())Adjust by adding or deleting elements of vector so that its size is "n".

Declaration: void resize(n, t = T())
capacity()Max number of elements of vector before reallocation.

Declaration: size_type capacity() const
reserve(size_t n)Max number of elements of vector set to "n" before reallocation.

Declaration: void reserve(size_t)
max_size()Max number of elements of vector possible.

Declaration: size_type max_size() const
其他方法和操作:

Method/operatorDescription
erase()

clear()
Erase all elements of vector.

Declaration: void clear()
erase(iterator)

erase(begin_iterator,end_iterator)
Erase element of vector. Returns iterator to next element.

Erase element range of vector. Returns iterator to next element.

Declarations:

iterator erase(iterator pos)
iterator erase(iterator first, iterator last)

=

Example: X=Y()
Assign/copy entire contents of one vector into another.

Declaration: vector& operator=(const vector&)
<Comparison of one vector to another.

Declaration: bool operator<(const vector&, const vector&)
==Returns bool. True if every element is equal.

Declaration: bool operator==(const vector&, const vector&)
at(index)

v[index]
Element of vector. Left and Right value assignment: v.at(i)=e; and e=v.at(i);

Declaration: reference operator[](size_type n)
front()

v[0]
First element of vector. (Left and Right value assignment.)

Declaration: reference front()
back()Last element of vector. (Left and Right value assignment.)

Declaration: reference back()
push_back(const T& value)Add element to end of vector.

Declaration: void push_back(const T&)
pop_back()Remove element from end of vector.

Declaration: void pop_back()
assign(size_type n,const T& t)Assign first n elements a value "t".
assign(begin_iterator,end_iterator)Replace data in range defined by iterators.

Declaration:
insert(iterator, const T& t)Insert at element "iterator", element of value "t".

Declaration: iterator insert(iterator pos, const T& x)
insert(iterator pos, size_type n, const T& x)Starting before element "pos", insert first n elements of value "x".

Declaration: void insert(iterator pos, size_type n, const T& x)
insert(iterator pos, begin_iterator,end_iterator)Starting before element "pos", insert range begin_iterator to end_iterator.

Declaration: void insert(iterator pos, InputIterator f, InputIterator l)
swap(vector& v2)Swap contents of two vectors.

Declaration: void swap(vector&)
迭代器方法/操作

Method/operatorDescription
begin()Return iterator to first element of vector.

Declaration: const_iterator begin() const
end()Return iterator to end of vector (not last element of vector but past last element)

Declaration: const_iterator end() const
rbegin()Return iterator to first element of vector (reverse order).

Declaration: const_reverse_iterator rbegin() const
rend()Return iterator to end of vector (not last element but past last element) (reverse order).

Declaration: const_reverse_iterator rend() const
++Increment iterator.
--Decrement iterator.

STL list:

两个例子:

第一个为数据类型为int
第二个为类实例

example 1:

// Standard Template Library example

#include <iostream>
#include <list>
using namespace std;

main()
{
list<int> L;
L.push_back(0);              // Insert a new element at the end
L.push_front(0);             // Insert a new element at the beginning
L.insert(++L.begin(),2);     // Insert "2" before position of first argument
// (Place before second argument)
L.push_back(5);
L.push_back(6);

list<int>::iterator i;

for(i=L.begin(); i != L.end(); ++i) cout << *i << " ";
cout << endl;
return 0;
}


example 2:
如果使用自定义类型,需要包括以下几个方面:
a. 复制构造函数

b.赋值运算符(=)重载
c.小于运算符重载<
d.等于运算符==重载

#include <iostream>
#include <list>
using namespace std;

// STL list需要重载 operators =, == and <.

class AAA
{
friend ostream &operator<<(ostream &, const AAA &);

public:
int x;
int y;
float z;

AAA();
AAA(const AAA &);
~AAA(){};
AAA &operator=(const AAA &rhs);
int operator==(const AAA &rhs) const;
int operator<(const AAA &rhs) const;
};

AAA::AAA()   // 构造函数
{
x = 0;
y = 0;
z = 0;
}

AAA::AAA(const AAA &in)   // 复制构造函数,传值
{
x = copyin.x;
y = copyin.y;
z = copyin.z;
}

ostream &operator<<(ostream &output, const AAA &aaa)
{
output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << endl;
return output;
}

AAA& AAA::operator=(const AAA &rhs)
{
this->x = rhs.x;
this->y = rhs.y;
this->z = rhs.z;
return *this;
}

int AAA::operator==(const AAA &rhs) const
{
if( this->x != rhs.x) return 0;
if( this->y != rhs.y) return 0;
if( this->z != rhs.z) return 0;
return 1;
}

//该函数是为了让STL list支持sort
int AAA::operator<(const AAA &rhs) const
{
if( this->x == rhs.x && this->y == rhs.y && this->z < rhs.z) return 1;
if( this->x == rhs.x && this->y < rhs.y) return 1;
if( this->x < rhs.x ) return 1;
return 0;
}

main()
{
list<AAA> L;
AAA Ablob ;

Ablob.x=7;
Ablob.y=2;
Ablob.z=4.2355;
L.push_back(Ablob);  // 在末尾插入一个新元素

Ablob.x=5;
L.push_back(Ablob);  // 传值,用默认的拷贝构造函数
//
Ablob.z=3.2355;
L.push_back(Ablob);

Ablob.x=3;
Ablob.y=7;
Ablob.z=7.2355;
L.push_back(Ablob);

list<AAA>::iterator i;

for(i=L.begin(); i != L.end(); ++i) cout << (*i).x << " "; // print member
cout << endl;

for(i=L.begin(); i != L.end(); ++i) cout << *i << " "; // print with overloaded operator
cout << endl;

cout << "Sorted: " << endl;
L.sort();
for(i=L.begin(); i != L.end(); ++i) cout << *i << " "; // print with overloaded operator
cout << endl;

return 0;
}


输出结果:

7 5 5 3
7 2 4.2355
5 2 4.2355
5 2 3.2355
3 7 7.2355

Sorted:
3 7 7.2355
5 2 3.2355
5 2 4.2355
7 2 4.2355


STL vector 和 list 函数比较:

Functionvectorlist
constructoryesyes
destructoryesyes
empty()yesyes
size()yesyes
resize()yesyes
capacity()yesno
reserve()yesno
max_size()yesyes
erase()yesyes
clear()yesyes
operator=yesyes
operator<yesyes
operator==yesyes
operator[]yesno
at()yesno
front()yesyes
back()yesyes
push_back()yesyes
pop_back()yesyes
assign()yesyes
insert()yesyes
swap()yesyes
push_front()noyes
pop_front()noyes
merge()noyes
remove()noyes
remove_if()noyes
reverse()noyes
sort()noyes
splice()noyes
unique()noyes
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: