2015/2/10 更新:
今天管理员通知我标题不能写加号的问题解决了,结果我试了下,还是那破样子啊。CSDN的MarkDown编辑器着实坑爹啊。昨晚加上今天已经被坑了两*次了。导致这篇博文是写的最烂的一篇了,而且没有任何心情去修改。
标题都没法写两个加号,导致我只能用CPP代替。
0.引言:
容器:一个容器就是一些特定类型对象的集合。
元素在顺序容器中的位置与其加入容器时的位置相对应。
关联容器:其中的元素位置 由相关联的关键字-值决定。
关联容器的分类:顺序和无序。
1.顺序容器概述:
1.顺序容器:
vector /list /deque /array /string /forward_list
共上述六种。
2.性能折中:
1.向容器添加或者删除元素的代价。
2.非顺序访问元素的代价。与之对应的是随机访问(常见的是下边)
上面两者决定了容器之间操作的差异。
示例:向量中没有push_front 操作。因为在vector这个容器中头插元素的代价比较高,所以考虑性能,干脆就取消这个操作,用insert 代替。
3.array 相关:
此处的array是C++11标准刚刚收录的。不是我们常见的内置类型数组。但是很多特性一致,比如固定的大小。
4.forward_list 相关:
同array类似,都是C++11 新增的容器类型。单向链表。
容器选择相关:
除非有更好的选择,否则是推荐使用vector。
2.容器库概览:
1.迭代器:
迭代器都定义递增运算符。有的容器未定义下标运算符,但是容器都定义了迭代器。
2.迭代器范围:
迭代器范围概念:此概念是标准库的基础。迭代器范围是由一对指向同一个容器的迭代器表示的范围。
左闭合区间:表示的范围是典型的左闭右开。
数学表示:[beg,end) 同数学中的定义一致。隐含的定义了beg<=end.
我们总可以通过反复递增到达end。
1.当beg==end时,范围为空。
2.beg!=end时,范围中至少有一个元素。
3.容器的类型成员:
已经使用过的类型: size_type /iterator /const_iterator .
类型别名: 可以在不了解容器中具体的元素类型的情况时使用。
元素类型: value_type .容器中元素的类型。
引用类型: reference ,引用类型。
示例:
vector<string>::difference_type count
;
//定义了一个count变量,类型为difference_type.
4.begin/end 成员:
当调用两个成员函数时会或者指向首元素和尾后元素的迭代器。
多个版本:带c表示cosnt,带r表示反向迭代器。其中c&&r可以组合使用。
5.容器的定义和初始化:
1.除array之外都有default Cstor .
2.只有顺序容器才接受大小参数,array除外。
初始化的方式:
1.直接将一个容器初始化为另一个容器的拷贝,类似于拷贝构造函数和拷贝初始化。array除外。
上面这种情况要注意,容器的类型以及元素的类型要匹配。
2.拷贝一对迭代器指定的范围。
此种情况下不要求容器类型匹配,只要求元素类型相互关联即可。
习题解答:
9.1—9.34:
在经历两次浏览器崩溃,但是CSDN没有自动保存的情况下,我彻底崩溃了。所以我决定让那份答案永远的消失.
9.35
区别:
1.size是当前容器中元素的个数。
2.capacity是容器在未重新分配内存的情况下所能容纳的最大数量。
9.36
无可能。因为capacity是动态分配的。
9.37
1.list的内存占用不是连续的。
2.array 的是固定大小的。
9.38
#include <vector>
#include <iostream>
#include <list>
using namespace std;
int main(){
vector<int> ivec(10);
cout << "ivec'size is " << ivec.size() << endl
<< "ivec'capacity is " << ivec.capacity() << endl;
ivec.resize(50);
cout << "ivec'size is " << ivec.size() << endl
<< "ivec'capacity is " << ivec.capacity() << endl;
ivec.resize(100);
cout << "ivec'size is " << ivec.size() << endl
<< "ivec'capacity is " << ivec.capacity() << endl;
system("pause");
return 0;
}
9.39
终极目标是调整容器大小为512.
若读入的单词数量小于512,那么以空字符补齐即可。
若读入的单词数量大于512,那么截去后面多余的string.
9.40
答案可以参考9.39。
9.41
#include <vector>
#include<iostream>
#include <string>
using namespace std;
int main(){
vector<char> cvec = { 'a', 'f', 'e', 'u' };
string str(cvec.begin(), cvec.end());
for (auto x : str)
cout << x << " ";
cout << endl;
system("pause");
return 0;
}
9.42
**用
vector<string> svec
最好不过了。
9.43
总感觉这个题目出的比较怪。所以我决定跳过去。
9.44
难道你要我用KMP进行匹配?还是你想想用容器
vector<sting>
忘记告诉题目了。
9.45–9.449
略,字符串这里的题目暂时先放弃了。
9.50
求浮点数略。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main(){
vector<string> svec;
string word;
cout << "Enter strings " << endl;
while (cin>>word){
svec.push_back(word);
}
cout << "The sum is :";
int sum = 0;
for (auto& x : svec){
sum += stoi(x);
}
cout << sum << endl;
system("pause");
return 0;
}
9.51–9.52
略。