记录一次leveldb安装失败经历 最近准备学习leveldb的源码,在安装时出现了一些问题按照官方的安装步骤,在执行以下的命令时遇到了错误cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .找到出错的第一个位置error: ‘is_trivially_copy_constructible’ is not a member of ‘std’经搜索,发现这是由于gcc/g++的版本过低导致。参考链接。因此升级gcc和g++的版本,参考链接..
c++ const_cast转换运算符与volatile关键字 const_cast转换运算符用来去除变量的底层const属性,这里的变量的类型是指针或者引用类型,因为普通类型并没有底层const属性这个说法。const_cast使用实例:代码转自:IT男汉:C++ const_cast用法#include<iostream>using namespace std;void ConstTest1() { const int a = 5; int *p; p = const_cast<int*>(&a); (*p)..
c++列表初始化为什么更快 列表初始化是给数据成员分配内存空间时就进行初始化,就是说分配一个数据成员只要冒号后有此数据成员的赋值表达式(此表达式必须是括号赋值表达式),那么分配了内存空间后在进入函数体之前给数据成员赋值,就是说初始化这个数据成员此时函数体还未执行。...
关于STL中value_type函数的思考 // 摘自stl_iterator_base.htemplate <class _Iter>inline typename iterator_traits<_Iter>::value_type*__value_type(const _Iter&){ return static_cast<typename iterator_traits<_Iter>::value_type*>(0);}《STL源码剖析》上说的是value_type这.
关于vector容器的deallocator的思考 从STL源码剖析这本书上得到的vector容器的deallocate函数如下:void deallocate() { // 释放所有的分配的内存,为重新开辟一大段空间做准备,因为vector要求连续的数组 if (start) { data_allocator::deallocate(start, end_of_storage - start); } }这段代码看起来很合理,就是释放[start, end_of_storage)这一段内存空间。现在继续看data_allocato
关于STL中空间配置器中free_list的理解 freeList是一个元素类型为obj*的数组,freeList[i]代表着一串内存区块链表(注,为了方便说明,把这里的一大块空间称为一个链表,因为它有着与链表类似的表现形式,为了更好的突出链表的形式,上图中的两个区块没有连接在一起。实际上这一块空间是连续的,而链表中的两个节点在内存上不一定是连续的,需要注意)的首地址,每串区块的区块大小是不同的。假设freeList[0]代表一串区块大小为8的区块串,则它有可能是如下的形式可以看出,在一个区块链表中,每两个obj 对象之间的首地址的差值为一个区块的
spawn-fcgi: child exited with: 127可能的原因 第一种是动态链接库的问题,请参考https://blog.csdn.net/lucky_huijun/article/details/105165359第二种是没有正确的输入路径名,下面这样的是错误的spawn-fcgi -a 127.0.0.1 -p 9001 -f a.out正确的应该是spawn-fcgi -a 127.0.0.1 -p 9001 -f /a.out如果是第二种错误就打自己一巴掌吧^_^...
c++ primer 9.37为什么list或array没有capacity成员函数 vector容器是有capacity成员函数的,原因是vector需要支持通过索引对元素的随机存取功能,因此需要分配一块地址连续的内存空间,由于push_back()这样的操作,如果在push_back()操作时为新元素分配空间,则不能保证此时分配的空间与先前的空间是地址连续的,如果为已有的元素和现在新加入的元素重新分配一块连续的空间,再进行拷贝,则十分缓慢。综上,vector在实现时总是会多分配一些空间,作为预留的空间。回归正题,由于list不要求对元素的随机存取,因此不用额外分配空间,也就没有cap
c++ primer9.32 网上的解释为:参考链接:链接不过我试了下,下面的代码是可以的,暂时不知道原因#include <iostream>#include <string>#include <vector>#include <list>#include <deque>#include<forward_list>using namespace std;int main(){ vector<int> vi = {
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)); }于是
vector的erase函数的陷阱 在下面的代码中,我试图用erase删除vector中的所有值为偶数的元素。根据c++primer 11,erase的返回值是指向被删除元素之后元素的迭代器。根据我的想法,我认为既然是删除一个元素,那么该被删除元素之后的所有元素都会往前移动一个位置,因此在删除该元素后,指向该被删除元素的迭代其器变成指向下一个元素的迭代器,但是却出现了错误。晚上的解答是使用erase(p)之后,p变为无效状态。#include <iostream>#include <string>#incl.
c/c++判断字节序类型 代码来自《Linux高新能服务器编程》#include<stdio.h>void byteorder(){ union { short value; // short为2个字节,共16位 char union_bytes[sizeof(short)]; }test; test.value = 0x0102; if((test.union_bytes[0] == 1) && (test.union_bytes[1]==2)) { printf("b
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中屏蔽警告
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的类型.
重载赋值运算符时为什么需要返回引用类型? c++ primer P492:赋值运算符的行为与复合版本(什么是复合版本)的类似,左侧运算对象和右侧运算对象的值相等,并且运算符应该返回它左侧运算对象的一个引用。疑问:为什么要返回左侧运算对象的引用,返回它的拷贝不行?参考其他人的博客:Jessica要努力了。。:c++赋值运算符为什么要返回引用?做出以下的总结:重载赋值运算符时不一定非得返回左侧运算对象得拷贝,但是如果不这样做出错的风险会加大。当类没有指针类型的成员时返回左侧对象拷贝不会出错,代码如下:Test.h#pragma once
移动构造函数和拷贝构造函数的匹配规则 参考c++ primer第五版的StrVec类拷贝构造函数是StrVec::StrVec(const Strvec& s){...}移动构造函数是StrVec::StrVec(Strvec&& s) noexcept {...} 疑问:在初始化时是如何选择拷贝构造函数和移动构造函数的如StrVec s; // 使用默认构造函数初始化StrVec s1(s); // 这里调用拷贝构造函数还是移动构造函数?答案:c++ primer第五版477页如果一个类既有拷