20200218
Plan
60min: CPP sequential container
Notes
- assign 是使用提供的 iterator range 进行重新初始化。
- iterator 对于 vector 发生改变时,非常可能是会失效的。
- stack/queue 作为 container adapter 的适配器存在,非常巧妙的设计。
练习代码:
#include <vector>
#include <list>
#include <forward_list>
#include <iostream>
#include <queue>
#include <deque>
void test_init() {
std::list<std::string> authors = {"shikaiwi", "xiaojing"};
std::forward_list<std::string> authors_all(authors.begin(), authors.end());
auto begin = authors_all.cbegin();
auto end = authors_all.cend();
while (begin != end) {
std::cout << "found author: " << *begin << std::endl;
begin++;
}
}
void test_assign() {
std::vector<std::string> names = {"weixikai", "zhaoxiaojing", "chunshao"};
std::vector<const char*> new_names = {"shikaiwi", "xiaojing"};
names.assign(new_names.cbegin(), new_names.cend());
for(auto it = names.cbegin(); it != names.cend(); it++) {
std::cout << "found new name: " << *it << std::endl;
}
}
struct S {
int s1_;
int s2_;
S(int s1, int s2):s1_(s1), s2_(s2) {}
};
void test_emplace() {
std::vector<S> nums;
nums.emplace_back(1,2);
nums.emplace_back(2,3);
for(auto it = nums.cbegin(); it != nums.cend(); it++) {
std::cout << "s1: " << it->s1_ << ", s2: " << it->s2_ << std::endl;
}
}
void test_insert() {
// wrong usage: std::vector<int> nums = {1,2,3,4};
std::list<int> nums = {1,2,3,4};
auto begin = nums.begin();
while (begin != nums.end()) {
++begin;
nums.insert(begin, 1024);
++begin;
}
for(auto it = nums.cbegin(); it != nums.cend(); it++) {
std::cout << "num: " << *it << std::endl;
}
}
void test_queue() {
std::list<int> l;
// std::queue<int> == std::queue<int, std::deque<int>
std::queue<int, std::list<int>> q(l);
q.push(1);
q.push(2);
std::cout << "expect 1, found: " << q.front() << std::endl;
q.pop();
q.push(3);
std::cout << "expect 2, found: " << q.front() << std::endl;
q.pop();
std::cout << "expect 3, found: " << q.front() << std::endl;
}
int main() {
test_init();
test_assign();
test_emplace();
test_insert();
test_queue();
return 0;
}