学学学,不断地学。
顺序容器
类型 | 介绍 |
---|---|
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);