优雅地同时遍历多个容器

问:给定容器 C1, C2, C3, … Cn, 且已知 size(C1) == size(C2) == … == size(Cn); 如何优雅地 for (c1, c2, c3… cn) in (C1, C2, C3, … Cn): // do something 意义:可能会有两个同样大小的变长容器(vector 啊 list 啊 map 啊 blabla),确认是同样大小了,希望对其中索引相同的元素做某些事情,这种需求不属于最常见的一类,但属于一般都会遇到的一类。 答: 为了直观感受 “不优雅”, “丑陋的”,展示一下现有条件下可能的实现: C1_T::iterator iter1 = C1.begin(); C2_T::iterator iter2 = C2.begin(); … Cn_T::iterator itern = Cn.begin(); for (; […]

瞎搞 std::cout 的构造和析构顺序

本文使用 gcc4.8, libstdc++. 引入 昨天侃爷提了个问题: struct foo { foo(const std::string& c) :_c(c) {} ~foo() { std::cout << _c; } const string& _c; } bar(“aaa”) ; 会炸, 为什么呢. 因为 “aaa” 会被赋予一个临时的 string, 然后这个临时 string 在程序结束的时候早挂了, 所以会 sf. 可是, 有没有可能是 cout 先被析构, 导致整个程序挂掉? 讨论 理论上, cout 应该是早于 bar 被声明的(extern), 所以它析构的也会比 bar 晚. 肚学长提出编译器在生成可执行文件的时候做了特殊处理, 我觉得 运行库 和 标准库 […]

scope_exit 的 11 实现

#ifndef SCOPE_EXIT_HPP #define SCOPE_EXIT_HPP #include “pp_cat.h” #include <functional> #define SCOPE_EXIT_CLASSNAME(id) PP_CAT(__unique_classname__, id) #define SCOPE_EXIT_INSTANCENAME(id) PP_CAT(__unique_instance__, id) #define SCOPE_EXIT(…) struct SCOPE_EXIT_CLASSNAME(__LINE__) { typedef std::function<void(void)> fun; fun f_; SCOPE_EXIT_CLASSNAME(__LINE__) (fun f) :f_(f) { } ~SCOPE_EXIT_CLASSNAME(__LINE__) () { f_(); } } SCOPE_EXIT_INSTANCENAME(__LINE__) ([__VA_ARGS__]() #define SCOPE_EXIT_END ); #endif // SCOPE_EXIT_HPP 设计思路见 boost. 主要的方法是利用 析构函数, 在退出 scope 时自动执行代码. 1. 为了使 […]