c++学习记录
AnonymousCrawler
Stay hungry, stay foolish.
展开
-
结构体的大小还能动态变化?你听过柔性数组吗?
在刚开始写C代码的时候,我们可能会遇到这样一种情况:要存储一组同学的名字,可是每个同学的姓名长度不同,用固定大小的数组会很不方便而且会存在浪费内存的情况。这个时候我们引入了动态数组,通过malloc()函数申请内存按需分配大小。这时候问题来了,如果有一个学生的结构体需要存储姓名这样的属性我们该怎么做呢?同样的我们会在结构体中加入一个char*的指针成员.struct Student { int id; int age; char sex; char* name;}这样原创 2020-11-30 21:07:13 · 1749 阅读 · 0 评论 -
用宏定义获取枚举值的字符串
用宏定义获取枚举值的字符串最近在学习有限状态机的时候,遇到了一个问题,如何获取枚举类型的枚举值对应的字符串?第一反应就是就是创建一个字符串的映射数组。这样做确实能够达到效果,但是始终觉得不太好看。最后终于在StackOverFlow上找到了一个类似的问题,下面我介绍一下最佳答案,代码如下:代码段一: 作为头文件引入公共宏的部分/// enumFactory.h// expansion macro for enum value definition#define ENUM_VALUE(name,as原创 2020-11-23 20:37:58 · 949 阅读 · 0 评论 -
c++之getline(istream && is,string&str,char delim)用法及注意事项
最近使用到了getline(istream && is,string&str,char delim), 这个函数的作用将输入流的字符串按照分割符delim为界分割出来。c++网站上的介绍是:从流获取线到字符串:1.从提取的字符是并将其存储到STR直到划界字符DELIM被发现(getline (istream&& is, string& str)默认分割符是“\ n”, )。2.如果原创 2017-12-26 11:58:04 · 6307 阅读 · 2 评论 -
如何选择指针中置空?NULL, nullptr, 0?
在使用指针的时候,为了防止野指针,我们要对指针初始置空。以前一直使用*ptr = NULL,其中NULL和0是完全等价的。这就造成了一个潜在的危险,当我们将void f(int*)这个函数重定义一个void f(int)函数。这个时候我们传入参数0, 就无法判断0是int类型还是int*类型。c++11使用nullptr代替了NULL,在上述情况下能避免歧义,不会出现错误。 所以,在支持C+原创 2018-01-12 13:18:36 · 766 阅读 · 0 评论 -
C++之emplace_back() VS push_back()
最近在提交的时候发现同样的代码别人比我的快,原因就是我代码中的push_back()而别人用的是emplace_back(). 于是我上cppreference.com了解了一下emplace_back()。 使用push_back()的时候,会首先构造一个元素,然后拷贝复制传递给容器。使用emplace_back()时,会在容器所在的内存空间直接构造一个元素,避免了额外的移动或赋值操作。通转载 2018-01-12 13:51:38 · 971 阅读 · 0 评论 -
std::vector::rbegin倒序迭代器
begin()和end()是顺序迭代,rbegin()和rend()是倒序迭代。详http://www.cplusplus.com/reference/vector/vector/rbegin/。 下面是一个实例:// vector::rbegin/rend#include <iostream>#include <vector>int main (){ std::vector<int>翻译 2018-01-12 14:00:15 · 3005 阅读 · 0 评论 -
vector中resize()和reserve()
Mark一下:1.resize(n)和resize(n, t), 调整vector数组的大小,多减少补,后面的t是初始化数值,添加时会调用一次构造函数,如果n的大小大于容器的话,容器的内存分配器将自动重新分配内存,如果内存分配失败,会报错 bad_alloc 。例子:(来自c++官方文档)// resizing vector#include #include int main原创 2017-12-28 23:49:37 · 1431 阅读 · 0 评论