C++顺序容器一

erase:擦掉; 抹去; 擦掉; 清除

emplace:放列,安置,安放

list.cpp

主要关于容器的初始化操作

?
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
80
81
82
83
84
85
86
87
88
#include <list>
#include <forward_list>
#include <deque>
#include <string>
#include <iostream>
#include <array>
using  namespace  std;
//vector-可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢
//list-双向链表,只支持双向顺序访问,在list中任何位置进行插入删除速度都很快
//forward_list-单向链表,只支持单向顺序访问,在链表中任何位置进行插入删除速度都很快
//deque-双端队列,支持快速随机访问,在头尾位置插入删除速度很快
//array-固定大小数组,支持快速随机访问,不能添加或删除元素
//string-与vector相似的容器,但专门用于保存字符,随机访问快,在尾部插入删除速度快
int  main(){
     //使用给定的元素初始化
     //列表初始化
     list<string> authors ={ "hello" , "rihl" , "sdsdsd" };
     for ( auto  w:authors){
         cout<<w<<endl;
     }
 
     //拷贝初始化
     list<string> authors2(authors);
     for ( auto  w:authors2){
         cout<<w<<endl;
     }
 
     list<string> slist(10, "hi" );
     for ( auto  w:slist){
         cout<<w<<endl;
     }
 
     //只支持单向遍历
     forward_list< int > fl(10);
     for ( auto  w:fl){
         cout<<w<<endl;
     }
 
     list<string> demo = { "hi" , "sd" , "we" , "gf" };
     auto  it1 = demo.begin();
     auto  it2 = demo.end();
     while (it1!=it2){
         cout<<*it1<<endl;
         ++it1;
     }
 
     //反向迭代器
     list<string>::reverse_iterator it3 = demo.rbegin();
     list<string>::reverse_iterator it4 = demo.rend();
     //倒序遍历-反向遍历
      while (it3!=it4){
         cout<<*it3<<endl;
         ++it3;
     }
 
     //array的定义,除了制定类型外,还要指定容器大小
     //列表初始化
     //不够十个,剩下的元素执行默认初始化
     array< int ,10> hello_array = {12,12,4,5,54,65,78};
     array<string,10> hello_string_array = { "as" , "sd" , "sds" , "sdfsd" };
     auto  array_it = hello_array.begin();
     while (array_it!=hello_array.end()){
         cout<<*array_it<<endl;
         ++array_it;
     }
 
     //双端队列
     deque<string> h_deque(10);
     for ( auto  w:h_deque){
         cout<<w<<endl;
     }
 
     deque<string> deque2={ "s" , "ds" , "sdsdsd" , "qweqe" };
     for ( auto  w:deque2){
         cout<<w<<endl;
     }
 
     deque<string> deque3(19, "ninimimi" );
     for ( auto  w:deque3){
         cout<<w<<endl;
     }
 
     //deque的拷贝初始化
     deque<string> deque4 = deque3;
     for ( auto  w:deque4){
         cout<<w<<endl;
     }
}

list2.cpp

赋值,assign和swap操作

?
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
#include <list>
#include <forward_list>
#include <deque>
#include <string>
#include <iostream>
#include <array>
#include <vector>
using  namespace  std;
/*
赋值
assign
swap
*/
int  main(){
 
     //赋值
     array< int ,10> a1 = {0,1,2,3,4,5,6,7,8,9};
     array< int ,10> a2 = {0};  //所有元素的值均为零
     a1=a2;  //替换a1中的元素
     a2={0,90,122,23,232,3};   //使用花括号列表赋予数组,书上说不能将一个花括号列表赋予数组。。。
 
     for ( auto  a:a1){
         cout<<a<<endl;
     }
     cout<< "=============" <<endl;
     for ( auto  a:a2){
         cout<<a<<endl;
     }
     //赋值运算符要求左边和右边的运算对象具有相同的类型。他将右边运算对象中的所有元素
     //拷贝到左边运算对象中去。
 
     //使用assign(顺序容器)
     //顺序容器(处array外)还定义了一个名为assign的成员
     list<string> names;
     vector< const  char *> old_style;
 
     //用字符指针指向一个字符串
     //把字符串的第一个字符的地址赋予指针
     const  char  *s1 =  "hello,world" ;
     const  char  *s2 =  "nishi" ;
     const  char  *s3 =  "sdsdsd" ;
     old_style.push_back(s1);
     old_style.push_back(s2);
     old_style.push_back(s3);
 
     //将names中的元素替换为迭代器指定的范围中的元素的拷贝
     names.assign(old_style.begin(),old_style.end());
 
     for ( auto  a : names){
         cout<<a<<endl;
     }
 
     //使用swap
     //swap操作交换两个相同类型容器中的内容
     list<string> v1={ "sd" , "sdsd" };
     list<string> v2={ "sa" , "wd" };
     swap(v1,v2);
     for ( auto  a:v2){
         cout<<a<<endl;
     }
}

list3.cpp

向顺序容器添加元素

?
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
#include <deque>
#include <string>
#include <iostream>
#include <array>
#include <vector>
#include <list>
using  namespace  std;
//向顺序容器添加元素
//array类型的容器不支持这些操作
int  main(){
 
     //使用push_back操作
 
     list<string> l;
     l.push_back( "sdsds" );
 
     //使用push_front
     l.push_front( "push_front" );
 
     for ( auto  a:l){
         cout<<a<<endl;
     }
 
     deque< int > d;
     d.push_back(2);
     d.push_front(1);
     for ( auto  a:d){
         cout<<a<<endl;
     }
 
     //vector不支持push_front操作
 
     //在容器的特定位置添加元素
     //使用insert操作
     //每个insert函数接受一个迭代器作为第一个参数,迭代器指出了在容器中什么位置放置元素
     //insert函数将元素插入到迭代器所指定的位置之前
     list< int > ll = {1,3,4};
     auto  it = ll.begin();
     ll.insert(++it,2);
     for ( auto  a:ll){
         cout<<a<<endl;
     }
 
     //使用insert插入范围元素
     vector< int > ivec = {1,2,4};
     //将10个元素插入到ivec的末尾
     ivec.insert(ivec.end(),10,8);
     for ( auto  i:ivec){
         cout<<i<<endl;
     }
 
     //insert函数的返回值
     list<string> lst;
     auto  lst_it = lst.begin();
     string word;
     while (cin>>word){
         lst_it = lst.insert(lst_it,word);
     }
 
     //新标准引入的三个成员
     //emplace_front,emplace,emplace_back这些操作分别对应push_front,insert,push_back
 
     //当调用push或insert成员函数时,我们将元素类型的对象传递给她们,这些对象被拷贝到容器中
     //当我们调用一个emplace成员函数时,则是将参数传递给元素类型的构造函数
     //emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配
 
}

list4.cpp

访问顺序容器中的元素

?
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
#include <deque>
#include <string>
#include <iostream>
#include <array>
#include <vector>
#include <list>
using  namespace  std;
//访问顺序容器中的元素
//包括array在内的每个顺序容器都有一个front成员函数
//而除forward_list之外的所有容器都有一个back成员函数
//这两个操作分别返回首元素和尾元素的引用
int  main(){
 
     list<string> l = { "sadfsad" , "sadfsadf" , "asdfsad" };
     if (!l.empty()){
         //返回首元素和尾元素的引用
         auto  s1 = l.front();
         auto  s2 = l.back();
         cout<<s1<< "   " <<s2<<endl;
 
         //如果容器是一个const对象,则返回const的引用
         //如果容器不是const,则返回值是普通引用
     }
 
     //下标操作和安全的随机访问
     //提供快速随机访问的容器(string,vector,deque和array)也都提供下标运算符
     vector< int > ivec = {1,2,45,13};
     cout<<ivec.at(4)<<endl;  //抛出异常,下标越界
     //terminate called after throwing an instance of 'std::out_of_range'
     //what():  vector::_M_range_check
}

list5.cpp

删除元素

?
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
#include <deque>
#include <string>
#include <iostream>
#include <array>
#include <vector>
#include <list>
using  namespace  std;
//删除元素
int  main(){
     //在删除元素之前,必须确保他们是存在的
     //pop_front和pop_back成员函数
     //分别删除首元素和尾元素
     //vector和string不支持push_front,同样也不支持pop_front
     list<string> hello = { "sdsdsd" , "sdfsdfdsfdsf" , "hhlo" };
     while (!hello.empty()){
         hello.pop_front();
     }
 
     if (hello.empty()){
         cout<< "容器是空的" <<endl;
     }
 
     //从容器内部删除一个元素
     //成员函数erase从容器中指定为删除元素,我们可以删除由一个迭代器指定的单个元素,也可以删除某个范围内元素
     //erase成员函数都返回指向删除的(最后一个)元素之后位置的迭代器
     list< int > il = {0,1,2,3,4,5,6,7,8,9};
     auto  it = il.begin();
     while (it!=il.end()){
         if (*it % 2){
             it = il.erase(it);
         } else  {
             ++it;
         }
     }
     for ( auto  a:il){
         cout<<a<<endl;
     }
}

=====END=====




FROM:  http://my.oschina.net/xinxingegeya/blog/228316

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值