|
vector(向量容器)的基本使用入门: |
简介 |
vector 的特点:
(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组 一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。
(2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at()
(3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是 要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的。
(4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。 Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现 是按照顺序表的原理。
(5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop 。
(6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷 贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创 建vector 时就指定其空间大小。 Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的 任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的 元素所处的位置或是在Vector中插入元素则是线性时间复杂度。
基本方法:
1.at() 返回指定位置的元素
语法:
TYPE at( size_type loc );
//差不多等同v[i];但比v[i]安全;
2.back() 返回最末一个元素
3.begin() 返回第一个元素的迭代器
4.capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)
5.clear() 清空所有元素
6.empty() 判断Vector是否为空(返回true时为空)
7.end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
8.erase() 删除指定元素
语法:
iterator erase( iterator loc );
//删除loc处的元素
iterator erase( iterator start, iterator end );
//删除start和end之间的元素
9.front() 返回第一个元素的引用
10.get_allocator() 返回vector的内存分配器
11.insert() 插入元素到Vector中
语法: iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, void insert( iterator loc, size_type num, const TYPE &val ); //在指定位置loc前插入num个值为val的元素 void insert( iterator loc, input_iterator start, input_iterator end );
//在指定位置loc前插入区间[start, end)的所有元素
12.max_size() 返回Vector所能容纳元素的最大数量(上限)
13.pop_back() 移除最后一个元素
14.push_back() 在Vector最后添加一个元素
15.rbegin() 返回Vector尾部的逆迭代器
16.rend() 返回Vector起始的逆迭代器
17.reserve() 设置Vector最小的元素容纳数量 //为当前vector预留至少共容纳size个元素的空间
18.resize() 改变Vector元素数量的大小
语法:
void resize( size_type size, TYPE val ); //改变当前vector的大小为size,且对新创建的元素赋值val
19.size() 返回Vector元素数量的大小
20.swap() 交换两个Vector 语法: void swap( vector &from )
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#define _CRT_SECURE_NO_WARNINGS
#include
#include
using
namespace
std;
struct
Teacher
{
char
name[20];
int
age;
};
void
printfA(vector<
int
> &tmp){
int
size = tmp.size();
for
(
int
i = 0; i < size;i++)
{
cout << tmp[i] <<
","
;
if
(i+1==size)
{
cout << endl;
}
}
}
void
main()
{
//vector是一个模板类 在使用模板类的时候需要指明具体的类型
vector<
int
>v1(5);
//相当于int v1[5]
//赋值打印
cout <<
"vector赋值打印:"
<< endl;
for
(
int
i = 0; i < 5;i++)
{
v1[i] = i + 1;
cout << v1[i] << endl;
}
//类做函数参数
vector<
int
>v2(20);
v2 = v1;
cout <<
"类做函数参数:"
<< endl;
printfA(v2);
vector<
int
>v3(20);
v3.push_back(100);
//push_back会在类结尾进行添加新的数值,并且会将前面的二十个元素进行初始化
printfA(v3);
//初始化Teacher结构体
Teacher t1, t2;
t1.age = 10;
strcpy
(t1.name,
"张锋"
);
t2.age = 20;
strcpy
(t2.name,
"柴宇婷"
);
//声明一个Teacher类型的vector模板类
vector
vTeacher[0] = t1;
vTeacher[1] = t2;
cout <<
"Teacher类型的vector模板:"
<< vTeacher[0].age <<
"---"
<< vTeacher[2].age << endl;
//v声明一个 Teacher * 类型的vector模板类
vector
vTeacherPoint[0] = &t1;
vTeacherPoint[1] = &t2;
cout <<
"打印指针类型vector:"
<< endl;
int
vTeacherPointSize = vTeacherPoint.size();
for
(
int
i = 0; i < vTeacherPointSize; i++)
{
Teacher *temp = vTeacherPoint[i];
if
(temp != NULL)
{
cout <<
"第"
<< i + 1 <<
"个老师的年龄为:"
<< temp->age <<
" 名字为:"
<< temp->name << endl;
}
}
system
(
"pause"
);
}
|
|
stack(栈)的基本使用入门:
|
简介
|
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,— —也就是说实现了一个先进后出(FILO)的数据结构。
1.empty() 堆栈为空则返回真
2.pop() 移除栈顶元素
3.push() 在栈顶增加元素
4.size() 返回栈中元素数目
5.top() 返回栈顶元素
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#include
#include
using
namespace
std;
struct
Teacher
{
int
age;
char
name[20];
};
void
printfStack(stack<
int
> &tmp){
while
(!tmp.empty ())
{
cout << tmp.top() << endl;
tmp.pop();
}
}
void
main(){
//声明一个stack类型的容器
stack<
int
> s1;
//栈是先进后出
//循环添加元素
for
(
int
i = 0; i < 5; i++)
{
s1.push(i + 1);
}
//1.0通过指针做函数参数进行传参
cout <<
"通过指针调用 演示:"
<< endl;
printfStack(s1);
//2.0遍历站内元素
while
(!s1.empty ())
{
cout << s1.top() << endl;
//获取栈顶元素
s1.pop();
//弹出栈顶元素
}
//3.0放Teacher
cout <<
"Teacher 演示:"
<< endl;
stack
Teacher t;
for
(
int
i = 0; i < 5;i++)
{
t.age = i+20;
sTeacher.push(t);
}
while
(!sTeacher.empty ())
{
cout << sTeacher.top().age << endl;
sTeacher.pop();
}
//4.0放Teacher *
cout <<
"Teacher * 演示:"
<< endl;
stack
Teacher t1,t2,t3;
t1.age = 20;
t2.age = 21;
t3.age = 22;
sTeacherPoint.push(&t1);
sTeacherPoint.push(&t2);
sTeacherPoint.push(&t3);
while
(!sTeacherPoint.empty ())
{
//Teacher * tmp = sTeacherPoint.top();
cout << sTeacherPoint.top()->age << endl;
sTeacherPoint.pop();
}
system
(
"pause"
);
}
|
|
Queues(队列)的基本使用入门:
|
简介
|
C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
1.back() 返回一个引用,指向最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size() 返回队列中元素的个数
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
#include
#include
using
namespace
std;
struct
Teacher
{
int
age;
char
name[20];
};
void
printfQueue(queue
while
(!tmp.empty())
{
cout << tmp.front().age << endl;
tmp.pop();
}
}
void
main()
{
//1.0定义一个queue容易
cout <<
"基础演示 :"
<< endl;
queue<
int
> q;
for
(
int
i = 0; i < 5; i++)
{
q.push(i + 1);
}
int
size = q.size();
for
(
int
i = 0; i < size; i++)
{
cout << q.front() << endl;
q.pop();
}
//2.0放Teacher
cout <<
"Teacher 演示:"
<< endl;
queue
Teacher t;
for
(
int
i = 0; i < 2;i++)
{
t.age = 21 + i;
qTeacher.push(t);
}
printfQueue(qTeacher);
//4.0放Teacher *
cout <<
"Teacher * 演示:"
<< endl;
queue
Teacher t1, t2, t3;
t1.age = 20;
t2.age = 21;
t3.age = 22;
qTeacherPoint.push(&t1);
qTeacherPoint.push(&t2);
qTeacherPoint.push(&t3);
while
(!qTeacherPoint.empty())
{
//Teacher * tmp = sTeacherPoint.top();
cout << qTeacherPoint.front()->age << endl;
qTeacherPoint.pop();
}
system
(
"pause"
);
}
|
|
list(双向链表)的基本使用入门:
|
简介 |
是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个 信息块(即实际存储的数据)、一个前驱指针和一个后驱指针。它无需分配指定 的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指
针将有序的元素链接起来。 由于其结构的原因,list 随机检索的性能非常的不好,因为它不像vector 那 样直接找到元素的地址,而是要从头一个一个的顺序查找,这样目标元素越靠后, 它的检索时间就越长。检索时间与目标元素的位置成正比。 虽然随机检索的速度不够快,但是它可以迅速地在任何节点进行插入和删除 操作。因为list 的每个节点保存着它在链表中的位置,插入或删除一个元素仅对 最多三个元素有所影响,不像vector 会对操作点之后的所有元素的存储地址都有 所影响,这一点是vector 不可比拟的。
list 的特点:
(1) 不使用连续的内存空间这样可以随意地进行动态操作;
(2) 可以在内部任何位置快速地插入或删除,当然也可以在两端进行push和pop 。
(3) 不能进行内部的随机访问,即不支持[ ] 操作符和vector.at() ;
Lists将元素按顺序储存在链表中,与向量(vectors)相比,它允许快速的插入 和删除,但是随机访问却比较慢.
|
用法
|
1.assign() 给list赋值
2.back() 返回最后一个元素的引用
3.begin() 返回指向第一个元素的迭代器
4.clear() 删除所有元素
5.empty() 如果list是空的则返回true
6.end() 返回末尾的迭代器
7.erase() 删除一个元素 语法: iterator erase( iterator loc );//删除loc处的元素 iterator erase( iterator start, iterator end ); //删除start和end之间的元素
8.front() 返回第一个元素的引用
9.get_allocator() 返回list的配置器
10.insert() 插入一个元素到list中 语法: iterator insert( iterator loc, const TYPE &val ); //在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, void insert( iterator loc, size_type num, const TYPE &val ); //定位置loc前插入num个值为val的元素 void insert( iterator loc, input_iterator start, input_iterator end ); //在指定位置loc前插入区间[start, end)的所有元素
11.max_size() 返回list能容纳的最大元素数量
12.merge() 合并两个list 语法: void merge( list &lst );//把自己和lst链表连接在一起 void merge( list &lst, Comp compfunction ); //指定compfunction,则将指定函数作为比较的依据。
13.pop_back() 删除最后一个元素
14.pop_front() 删除第一个元素
15.push_back() 在list的末尾添加一个元素
16.push_front() 在list的头部添加一个元素
17.rbegin() 返回指向第一个元素的逆向迭代器
18.remove() 从list删除元素 语法: void remove( const TYPE &val ); //删除链表中所有值为val的元素
19.remove_if() 按指定条件删除元素
20.rend() 指向list末尾的逆向迭代器
21.resize() 改变list的大小 语法: void resize( size_type num, TYPE val ); //把list的大小改变到num。被加入的多余的元素都被赋值为val22.
22.reverse() 把list的元素倒转
23.size() 返回list中的元素个数
24.sort() 给list排序 语法: void sort();//为链表排序,默认是升序 void sort( Comp compfunction );//采用指定函数compfunction来判定两个元素的大小。
25.splice() 合并两个list 语法: void splice( iterator pos, list &lst );//把lst连接到pos的位置 void splice( iterator pos, list &lst, iterator del );//插入lst中del所指元素到现链表的pos上 void splice( iterator pos, list &lst, iterator start, iterator end );//用start和end指定范围。
26.swap() 交换两个list 语法: void swap( list &lst );// 交换lst和现链表中的元素
27.unique() 删除list中重复的元素 语法: void unique();//删除链表中所有重复的元素 void unique( BinPred pr );// 指定pr,则使用pr来判定是否删除。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
#include
#include
using
namespace
std;
struct
Teacher
{
int
age;
char
name[20];
};
void
main ()
{
//1.0定义list容器
list<
int
> l;
for
(
int
i = 0; i < 5; i++)
{
l.push_back(i + 1);
}
cout <<
"list数量:"
<< l.size() << endl;
//2.0定义一个迭代器 指向第一个元素
list<
int
>::iterator cur = l.begin();
while
(cur!=l.end ())
{
cout << *cur << endl;
cur++;
}
//3.0插入元素
cout <<
"------------插入一个元素------------"
<< endl;
cur = l.begin();
cur++;
cur++;
l.insert(cur, 100);
for
(list<
int
>::iterator p = l.begin(); p != l.end();p++)
{
cout << *p << endl;
}
//4.0list放Teacher
cout <<
"------------list放Teacher------------"
<< endl;
list
Teacher t1, t2;
t1.age = 10;
t2.age = 20;
lTeacher.push_back(t1);
lTeacher.push_back(t2);
for
(list
{
cout << p->age << endl;
}
//5.0list放Teacher *
cout <<
"------------list放Teacher *------------"
<< endl;
list
lTeacherPoint.push_back(&t1);
lTeacherPoint.push_back(&t2);
for
(list
{
Teacher *tmp = *p;
cout << tmp->age << endl;
}
system
(
"pause"
);
}
|
迭代器:
|
迭代器是一种对象,它能够用来遍历STL容器中的部分或全部元素,每个迭 代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器 是一种概念上的抽象:那些行为上象迭代器的东西都可以叫做迭代器。然而迭代 器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。
迭代器提供一些基本操作符:*、++、==、! =、=。这些操作和C/C++“操作 array元素”时的指针接口一致。不同之处在于,迭代器是个所谓的smart pointers, 具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因 此,每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器 以嵌套的方式定义于内部。因此各种迭代器的接口相同,型别却不同。这直接导 出了泛型程序设计的概念:所有操作行为都使用相同接口,虽然它们的型别不同。
迭代器使开发人员不必整个实现类接口。只需提供一个迭代器,即可遍历类 中的数据结构,可被用来访问一个容器类的所包函的全部元素,其行为像一个指 针,但是只可被进行增加(++)或减少(--)操作。举一个例子,你可用一个迭代器 来实现对vector容器中所含元素的遍历。 如下代码对vector容器对象生成和使用了迭代器:
vector<
int
> the_vector;
vector<
int
>::iterator the_iterator;
for
(
int
i = 0; i < 10; i++)
the_vector.push_back(i);
int
total = 0;
the_iterator = the_vector.begin();
while
(the_iterator != the_vector.end())
{
total += *the_iterator; the_iterator++;
}
cout <<
"Total="
<< total << endl;
提示:通过对一个迭代器的解引用操作(*),可以访问到容器所包含的元素。
|