摘要: Variadic Templates 基础知识 1 可变参数包,可以很方便的完成recursive function call(递归函数调用) 2 typename... Types || const Types&... args || print(args...) 三个点的位置是语法规定,不必深究 阅读全文
posted @ 2021-01-19 22:39 Truman001 阅读(73) 评论(0) 推荐(0) 编辑
摘要: C++类型转换 static_cast 任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast example: int j=10; double value=static_cast<double>(j)/2; void *p =&d; //必须确保d是double类 阅读全文
posted @ 2021-07-24 22:15 Truman001 阅读(19) 评论(0) 推荐(0) 编辑
摘要: /* 优化string 复制的时候 仅复制引用,只有在修改内容时,才复制内容 即实现写时拷贝 */ class COWMyString { public: //默认参数 COWMyString(const char *str = "") :m_str(strcpy(new char[strlen(s 阅读全文
posted @ 2021-03-17 17:01 Truman001 阅读(97) 评论(0) 推荐(0) 编辑
摘要: class A { public: //静态函数,返回引用 static A &GetInstance() {//静态局部变量 static A s_instance; return s_instance; } private: //默认构造函数 A() = default; /* 拷贝构造函数 用 阅读全文
posted @ 2021-03-17 16:13 Truman001 阅读(33) 评论(0) 推荐(0) 编辑
摘要: /* 实现一个string满足基本用法 */ class MyString { public: //默认参数 MyString(const char *str=""):m_str(strcpy(new char[strlen(str)+1], str)) { } ~MyString(void) { 阅读全文
posted @ 2021-03-17 16:12 Truman001 阅读(62) 评论(0) 推荐(0) 编辑
摘要: /* 实现一个线程安全的队列 */ template <class T> class SafeQueue { public: SafeQueue(void):q(),m(),c() {} ~SafeQueue(void) {} // Add an element to the queue. void 阅读全文
posted @ 2021-03-17 16:06 Truman001 阅读(326) 评论(0) 推荐(0) 编辑
摘要: /* 智能指针的简单实现 */ template<typename T> class SamrtPtr { public: //构造函数 SamrtPtr(T* ptr = nullptr) :m_ptr(ptr) { if (m_ptr) { m_count = new size_t(1); } 阅读全文
posted @ 2021-03-17 16:04 Truman001 阅读(55) 评论(0) 推荐(0) 编辑
摘要: 哈希表 相关概念 避免碰撞 — 构造哈希函数、再散列函数法、哈希表加链表 虽然很好的处理了碰撞的问题,但是当单链表很长时,遍历链表的速度会很慢。 当链表太长时(经验法则:当元素个数比 bucket 数还要多时),想办法将其打散 — 将 bucket 扩充大约两倍。选择53的倍数附近的素数 53 → 阅读全文
posted @ 2021-03-14 16:29 Truman001 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 红黑树 相关概念 1 rb_tree 是一种高度平衡的搜索二叉树,其元素排列的规则有利于 search 和 insert,并同时保持适度的平衡。 2 rb_tree 提供遍历操作以及 iterator。元素放入后有一定的排列规则,按正常规则(++ iter)迭代器遍历时为输出为排序状态(sorted 阅读全文
posted @ 2021-03-14 16:11 Truman001 阅读(140) 评论(0) 推荐(0) 编辑
摘要: void TestMaxElement() { vector<int> vi{1,7,9,3,15,6,20}; for (auto i:vi) { cout << i << std::endl; } auto begin = vi.begin()+2; std::cout << *begin << 阅读全文
posted @ 2021-02-26 23:33 Truman001 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 递归函数 编写递归函数步骤: 1 明确你这个函数想要干什么,函数功能是什么,要完成什么样的一件事 2 寻找递归结束条件,所谓递归,就是会在函数内部代码中,调用这个函数本身, 所以,我们必须要找出递归的结束条件,不然的话,会一直调用自己,进入无底洞。 也就是说,我们需要找出当参数为啥时,递归结束,之后 阅读全文
posted @ 2021-02-05 22:22 Truman001 阅读(311) 评论(0) 推荐(0) 编辑