模板实现的一个庞大工具库——STL

发布时间:2026/6/2 9:36:46

模板实现的一个庞大工具库——STL 上文提出STL 就是用模板实现的一个庞大工具库。std::vector更是大家最常用的stl的容器之一。我们都知道一个容器通常会有很多构造方法例如#include vector int main() { // 长度和元素初始化 std::vectorchar vec0(5, 0); // 使用迭代器初始化 std::vectorchar vec1(vec0.begin(), vec0.end()); }我们可以根据上方代码自己简单实现一下这样的形式#include iostream #include vector namespace my { template typename Type class vector { public: // 长度(无符号) 元素 构造 vector(size_t len, Type val) { std::cout vector(size_t len, Type val) std::endl; } // 首尾迭代器构造 template typename Iter vector(Iter begin, Iter end) { std::cout vector(Iter begin, Iter end) std::endl; } }; } // namespace my int main() { // 统一下方容器的类型 using Type char; Type val 48; // 标准vector std::vectorType stdVec; // 自己实现的vector my::vectorType vec0(5, val); my::vectorType vec1(stdVec.begin(), stdVec.end()); }输出结果vector(size_t len, Type val) vector(Iter begin, Iter end)对于传入迭代器这种构造方式我们可以只用模板来实现因为我们并不能方便的写出各种情况下具体迭代器的数据类型。目前为止一切都是理想状态但是当我们把测试的数据类型改为 int呢int main() { // 统一下方类型 using Type int; // [modify]此处使用int Type val 48; // 标准vector std::vectorType stdVec; // 自己实现的vector my::vectorType vec0(5, val); my::vectorType vec1(stdVec.begin(), stdVec.end()); }输出结果vector(Iter begin, Iter end) vector(Iter begin, Iter end)我们惊讶的发现居然都调用了为我们为迭代器服务的构造方法。仔细回归代码发现确实应该打印两份Iter的版本。因为my::vectorType vec0(5, val);的两个参数都是int类型正好匹配到template typename Iter vector(Iter begin, Iter end) ;这个重载版本。显然这个情况并不是我们希望发生的。而如何进行处理这就需要用到SFINA这个技巧。

相关新闻