【C++ Primer】Part2·Day2 第九章 笔记及练习作答

学学学,不断地学。

顺序容器

类型介绍
vector可变大小数组,支持快速随机访问。在尾部之外位置插入/删除元素很慢。
duque双端队列,支持快速随机访问。在头尾位置插入/删除元素很快。
list双向链表,只支持双向顺序访问。任何位置插入/删除元素都很快。
forward_list单向链表,只支持单向顺序访问。任何位置插入/删除元素都很快。
string与vector相似的容器,但专门用于保存字符,随机访问快。在尾部插入/删除速度快。
array固定大小数组,支持快速随机访问。不能添加/删除元素。
赋值运算中的 swap
vector<int> c1,c2;

swap(c1,c2);		// 交换 c1 和 c2 的值, 两者必须为相同类型, 通常比拷贝快.
c1.swap(c2);		// swap 操作不会导致指向容器的迭代器、引用和指针失效. (除 array 和 string 外)

c1.assign(c2.begin(),c2.end());	// 将 c1 中的元素替换成迭代器范围中的元素,迭代器不能指向 c1.
c1.assign(c2);					// 将 c1 中的元素替换成初始化列表 c2 中的元素.
c1.assign(n,t);					// 将 c1 中的元素替换为 n 个值为 t 的元素.

vector对象的增长

  vector 和 string 的实现通常会分配比新的空间需求更大的内存空间,作为备用。
  vector 在每次重新分配内存空间时都要移动所有元素。

成员函数作用
c.shrink_to_fit()将 capacity() 减少为与 size() 相同大小
适用于vector、string和deque
c.capacity()c可以保存的元素个数(容量)
适用于vector、string
c.reserve(n)分配至少能容纳 n 个元素的内存空间
适用于vector、string

额外的 string 操作

s.append(args)将 args 追加到 s,返回一个指向 s 的引用。
s.replace(range,args)删除 s 中范围 range 内的字符,替换为 args 指定的字符

---------------------------------------------------------------- \ 我 是 分 割 线 / ----------------------------------------------------------------

小昭 の 练习作答

9.1 vector,deque,vector。
9.2 list<deque<int>> l;
9.3 略
9.4~9.5

bool find2(vector<int> vec, int p){
	vector<int>::iterator begin = vec.begin();
	vector<int>::iterator end = vec.end();
	while(begin != end){
		if(*begin == p) return true;
		++begin;
	}
	return false;
}
vector<int>::iterator find2(vector<int> vec, int p){
	vector<int>::iterator begin = vec.begin();
	vector<int>::iterator end = vec.end();
	while(begin != end){
		if(*begin == p) return begin;
		++begin;
	}
	return begin;
}

9.6 list不支持迭代运算( < , >) ,改成 iter1 != iter2
9.7~9.10 略
9.11

vector<int> vec1;
vector<int> vec2 = vec1;
vector<int> vec3{1,2,3};
vector<int> vec4 = {1,2,3};
vector<int> vec5(vec4.begin(),vec4.end());
vector<int> vec6(vec5);

9.12

接受一个容器创建其拷贝的构造函数, 需要容器类型、元素类型完全匹配.
接受两个迭代器创建拷贝的构造函数, 需要元素类型兼容.

9.13 使用迭代器范围。
9.14

list<char*> li;
vector<string> vec;
vec.assign(li.begin(),li.end());

9.15~9.16

vector<int> v1(2,1),v2(2,1);
if(v1 == v2) cout << "相等" << endl;

list<int> l1{3,3};
if(v1.size() != l1.size()) cout << "不相等" << endl;
else{
	auto vb = v1.begin();
	auto lb = l1.begin();
	for(;vb != v1.end() && lb != l1.end();++vb,++lb){
		if(*vb != *lb) cout << "不相等" << endl;
	}
	cout << "相等" << endl;
}

9.17 c1 和 c2 的容器类型和元素类型都完全相同。
9.18~9.19

deque<string> d;
string str;
while(cin >> str) d.push_back(str);
for(auto iter = d.begin();iter != d.end();++iter) cout << *iter << endl;

list<string> d;
string str;
while(cin >> str) d.push_back(str);
for(auto iter = d.begin();iter != d.end();++iter) cout << *iter << endl;

9.20

list<int> l1;
deque<int> d1,d2;
for(auto iter = l1.begin();iter != l1.end();++iter){
	if(*iter % 2 == 0) d1.push_back(*iter);
	else d2.push_back(*iter);
}

9.21 while 的每次循环,vector 中的所有元素会需要向后移动,而新元素会插入到前面。
9.22 迭代器失效。需要更新迭代器。

while(iter != mid){
	if(*iter == some_val){
		iter = iv.insert(iter,2 * some_val);
		++iter;	// 回到原来位置
	}
	++iter;
}

9.23~9.24 略
9.25 不会删除任何元素。从 elem1 到末尾迭代器的所有元素被删除。
9.26

int ia[] = {0,1,1,2,3,5,8,13,21,55,89};
vector<int> vec(begin(ia),end(ia));
list<int> li(begin(ia),end(ia));
for(auto it = vec.begin();it != vec.end();){
	if(*it % 2 == 0) ++it;
	else it = vec.erase(it);
}
for(auto it = li.begin();it != li.end();){
	if(*it % 2 == 1) ++it;
	else it = li.erase(it);
}

9.27~9.28 forward_list 略
9.29~9.39 略
9.40 1024,1024,1024,1048。
9.41

vector<char> vec;
string str(vec.begin(),vec.end());

9.42 str.reserve(100);

未完待续~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值