20200218

@ShiKaiWi

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;
}

More