随笔分类 - C++
容器相关
摘要:std::unordered_map 的键要求: std::unordered_map 是基于哈希表的数据结构。 它要求键类型必须支持哈希计算,也就是必须有对应的 std::hash 函数。 另外,键类型还必须支持相等比较(通过 operator==)。 如果键类型没有定义哈希函数(例如你自定义的
阅读全文
摘要:char字符->整数数字:std::isdigit 用于判断某个字符是否为数字(0-9)。 字符串->数字:std::stoi 用于将字符转换为整数。 int isdigit( int ch ); //std::isdigit 接受的参数类型为 int,通常会传递字符类型(char)作为参数,但是字
阅读全文
摘要:C++中支持 std::string str(v.begin(), v.end()); 这样的写法, 是因为C++的STL(标准模板库)容器和字符串类都支持迭代器范围构造函数。 这种写法主要涉及以下几个概念: 1. 迭代器范围构造函数 C++ 标准库中的许多容器(如 std::vector、std:
阅读全文
摘要:要将 std::vector<char> 转换为 std::string,可以通过 std::string 的构造函数直接从 vector 中构建字符串。 假设 std::vector<char> 包含的字符是有效的字符串(即以 null 结尾,或者你确定没有多余的字符),可以按照以下几种方法进行转
阅读全文
摘要:std::map(有序映射) std::unordered_map(无序映射) std::multimap(有序多重映射) std::unordered_multimap(无序多重映射) 它们的使用方式和特点略有不同,下面分别介绍这些数据结构及其基本用法。 1. std::map(有序映射) std
阅读全文
摘要:push_back 与 emplace_back 的区别 push_back: 功能:将一个对象(或其副本)添加到 vector 的末尾。 参数:接受一个对象(或其副本)的引用。 过程: 如果传入的是一个临时对象或一个已有对象,push_back 会创建该对象的副本(或者通过移动构造函数将其移动到
阅读全文
摘要:在 C++ 中,资源获取即初始化(RAII, Resource Acquisition Is Initialization)是一种管理资源的编程惯用法。其核心思想是将资源的获取和释放绑定到对象的生命周期中。具体来说: 资源获取: 在对象构造时获取资源,比如内存、文件句柄、网络连接等。 将资源的句柄或
阅读全文
摘要:placement new 是 C++ 中的一种特殊的内存分配技术,用来在指定的内存地址上直接构造对象。与普通的 new 运算符不同,placement new 并不分配新的内存,而是在已经分配好的内存上调用对象的构造函数。 placement new 的典型使用场景 当需要完全控制内存分配和释放时
阅读全文
摘要:传统的 union 联合体在 C++ 中虽然提供了一种能够在相同的内存空间内存储多种不同类型的方式,但它也有一些显著的缺陷和限制。这些缺陷让 union 的使用不太安全,尤其是在复杂的程序中。以下是传统 union 的几个主要缺陷: 1. 类型安全性缺失 union 可以同时存储不同类型的值,但它不
阅读全文
摘要:template<> 是用于 模板特化(Template Specialization) 的一种语法。 模板特化允许你为某些特定的模板参数提供不同的实现。例如,template<> struct Fac<0> 是一个对 Fac 模板类的 完全特化,它专门处理模板参数为 0 的情况 template<
阅读全文
摘要:template<int N>:非类型模板参数 template<int N> 是一个典型的非类型模板参数的例子。这里的 N 是模板的参数,但它不是一个类型,而是一个具体的整数值。这意味着,当你实例化模板时,你必须为 N 提供一个常量整数值。 示例: template<int N> struct A
阅读全文
摘要:constexpr 是 C++ 中用于声明 常量表达式 的关键字,表示一个变量或函数的值在编译时就可以确定,而不是在运行时计算。 这对优化非常有用,因为编译器可以直接将结果嵌入到程序中,减少运行时的开销。 通俗解释: 变量篇:如果你有一个 constexpr 变量,它的值在编译时就已经固定好了。比如
阅读全文