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

c++STL基本使用入门

2015-02-03 10:38 411 查看
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 <iostream>


#include <vector>


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<Teacher> vTeacher(5);


vTeacher[0] = t1;


vTeacher[1] = t2;


cout <<
"Teacher类型的vector模板:"
<< vTeacher[0].age <<
"---"
<< vTeacher[2].age << endl;


//v声明一个 Teacher * 类型的vector模板类


vector<Teacher *> vTeacherPoint(5);


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 <iostream>


#include <stack>


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> sTeacher;


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 *> sTeacherPoint;


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 <iostream>


#include <queue>


using
namespace
std;


struct
Teacher


{


int
age;


char
name[20];


};


void
printfQueue(queue<Teacher> &tmp){


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> qTeacher;


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 *> qTeacherPoint;


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赋值

语法: void assign( input_iterator start, input_iterator end );
//以迭代器start和end指示的范围为list赋值 void assign( size_type num, const TYPE &val );
//赋值num个以val为值的元素。

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 <iostream>


#include <list>


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> lTeacher;


Teacher t1, t2;


t1.age = 10;


t2.age = 20;


lTeacher.push_back(t1);


lTeacher.push_back(t2);


for
(list<Teacher>::iterator p = lTeacher.begin(); p != lTeacher.end(); p++)


{




cout <<p->age << endl;


}


//5.0list放Teacher *


cout <<
"------------list放Teacher *------------"
<< endl;


list<Teacher *> lTeacherPoint;


lTeacherPoint.push_back(&t1);


lTeacherPoint.push_back(&t2);


for
(list<Teacher *>::iterator p = lTeacherPoint.begin(); p != lTeacherPoint.end();p++)


{


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;


提示:通过对一个迭代器的解引用操作(*),可以访问到容器所包含的元素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: