c++ primer11学习记录
学习c++ primer11
取名太麻烦了
这个作者很懒,什么都没留下…
展开
-
c++列表初始化为什么更快
列表初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。...原创 2021-07-14 15:44:36 · 171 阅读 · 0 评论 -
c++ primer 9.37为什么list或array没有capacity成员函数
vector容器是有capacity成员函数的,原因是vector需要支持通过索引对元素的随机存取功能,因此需要分配一块地址连续的内存空间,由于push_back()这样的操作,如果在push_back()操作时为新元素分配空间,则不能保证此时分配的空间与先前的空间是地址连续的,如果为已有的元素和现在新加入的元素重新分配一块连续的空间,再进行拷贝,则十分缓慢。综上,vector在实现时总是会多分配一些空间,作为预留的空间。回归正题,由于list不要求对元素的随机存取,因此不用额外分配空间,也就没有cap原创 2021-07-04 19:59:44 · 275 阅读 · 0 评论 -
c++ primer9.32
网上的解释为:参考链接:链接不过我试了下,下面的代码是可以的,暂时不知道原因#include <iostream>#include <string>#include <vector>#include <list>#include <deque>#include<forward_list>using namespace std;int main(){ vector<int> vi = {原创 2021-07-04 19:39:10 · 101 阅读 · 0 评论 -
forward_lsit的erase操作为什么是删除指定的迭代器之后的元素
问题描述:在forward_list的这个容器中,没有erase接口,只提供了erase_after这个接口。其中erase _after(p)为删除迭代器p指向的位置之后的一个元素。那么为什么不能直接删除当前迭代器指向的元素呢。首先找到STL中slist.h,可以看到iterator erase_after(iterator __pos) { return iterator((_Node*) this->_M_erase_after(__pos._M_node)); }于是原创 2021-07-04 18:27:03 · 147 阅读 · 0 评论 -
vector的erase函数的陷阱
在下面的代码中,我试图用erase删除vector中的所有值为偶数的元素。根据c++primer 11,erase的返回值是指向被删除元素之后元素的迭代器。根据我的想法,我认为既然是删除一个元素,那么该被删除元素之后的所有元素都会往前移动一个位置,因此在删除该元素后,指向该被删除元素的迭代其器变成指向下一个元素的迭代器,但是却出现了错误。晚上的解答是使用erase(p)之后,p变为无效状态。#include <iostream>#include <string>#incl.原创 2021-07-02 11:05:56 · 223 阅读 · 0 评论 -
c语言strcat函数
头文件:#include<string.h>功能:连接两个字符串函数原型:char *strcat(char *dest, const char *src);注意事项:dest需要足够大的空间容纳拼接后的字符串代码示例1:错误的用法,空间分配不足#include<iostream>#include<vector> #include<string.h>#define _CRT_SECURE_NO_DEPRECATE // vs2017中屏蔽警告原创 2021-06-09 20:38:42 · 286 阅读 · 0 评论 -
c++ 中auto与decltype
#include<iostream>using namespace std;int main(){ const int i = 42; auto j = i; j = 1; cout<<j<<endl; // auto一般会忽略顶层const const auto &k = i; // 明确指定为顶层const //k = 1; // k是const引用 auto *p = &i; // p的类型.原创 2021-05-29 21:26:05 · 124 阅读 · 0 评论 -
重载赋值运算符时为什么需要返回引用类型?
c++ primer P492:赋值运算符的行为与复合版本(什么是复合版本)的类似,左侧运算对象和右侧运算对象的值相等,并且运算符应该返回它左侧运算对象的一个引用。疑问:为什么要返回左侧运算对象的引用,返回它的拷贝不行?参考其他人的博客:Jessica要努力了。。:c++赋值运算符为什么要返回引用?做出以下的总结:重载赋值运算符时不一定非得返回左侧运算对象得拷贝,但是如果不这样做出错的风险会加大。当类没有指针类型的成员时返回左侧对象拷贝不会出错,代码如下:Test.h#pragma once原创 2021-05-17 19:59:16 · 1686 阅读 · 2 评论 -
移动构造函数和拷贝构造函数的匹配规则
参考c++ primer第五版的StrVec类拷贝构造函数是StrVec::StrVec(const Strvec& s){...}移动构造函数是StrVec::StrVec(Strvec&& s) noexcept {...} 疑问:在初始化时是如何选择拷贝构造函数和移动构造函数的如StrVec s; // 使用默认构造函数初始化StrVec s1(s); // 这里调用拷贝构造函数还是移动构造函数?答案:c++ primer第五版477页如果一个类既有拷原创 2021-05-15 20:17:24 · 227 阅读 · 0 评论 -
迭代器以及普通指针*p++和*++p 待进一步探索
迭代器:对于*p++,见C++ primer第五版132页:后置递增的运算符优先级高于解引用运算符优先级,所以*p++等价于*(p++)。执行p++时,先将未递增的p保存下来,然后将p加一个单位,并返回未递增的p。所以*(p++)实际上是对未递增的p进行解引用,用代码解释更明确(STL源码剖析38页):后置递增运算符(it++)的重载如下const INT operator++(int){ INT temp = *this; ++(*this); return temp;}前置递增运算符原创 2021-05-14 22:40:26 · 85 阅读 · 0 评论 -
隐式销毁一个内置指针类型成员不会delete它所指向的对象
隐式销毁内置指针类型成员Test.h使用默认析构函数#pragma once#include<iostream>using namespace std;class Test{public: Test() = default; Test(int dt) : data(dt) {} Test(int dt, Test* p) : data(dt), ptest(p) {} void printData() { cout << data; }private原创 2021-05-14 16:35:38 · 243 阅读 · 0 评论 -
等号运算符只能重载为成员函数
如果将=运算符不定义为成员函数,那么此时的=是否还是赋值运算符。operator=必须是成员函数Test.h#pragma onceclass Test{public: Test() = default;private: int data;};Test.cpp#include<iostream>#include"Test.h"Test operator=(Test a, Test b) // error :operator=必须是成员函数{}int mai原创 2021-05-14 16:09:17 · 623 阅读 · 1 评论