
c++
cylianging
成长,让自己快乐。
展开
-
限制长度双向链表的插入操作
面试遇到的问题,一开始面试官是问我有什么方案可以实现排行榜,当时给出了两个方案。后面面试官又在我的其中一种方案上让我手写代码实现排序双线链表的插入,根据score值插入,并且链表长度限制在100。 需要考虑的点:1)插入在链表表头的;2)插入到链表表尾;3)插入到链表中间;4)需要在遍历整个链表的时候统计链表的长度;5)如果长度刚好在100而插入刚好在末尾,则此时不需要执行插入操...原创 2019-10-16 02:59:26 · 502 阅读 · 0 评论 -
Effective STL:杂记(一)
1. 避免使用vector<bool> vector<bool>实际上并不能算是一个STL容器,实际上也并不存储bool。因为一个对象要成为STL容器,就必须满足C++标准的第23.1节列出的所有条件,其中一个条件是,如果 c 是包含对象T的容器,而且 c 支持operator[],则必须能够编译下面代码:T *p = &c[0]; 也就是...原创 2019-10-13 18:47:54 · 321 阅读 · 0 评论 -
T t与T t = T()的区别
主要的区别就是默认构造函数对内置类型的初始化上。如果没有T中没有定义构造函数,则对于“T t”,并不会对 t 中内置类型设置初始值,是一个随机值。但对于“T t = T()”,对 t 中内置类型会设置初始值,如 int 类型会设置为0。而对于自定义类型,不管哪种方式,都会调用构造函数初始化。#include <iostream>using namespace std;...原创 2019-10-12 16:30:52 · 594 阅读 · 1 评论 -
删除链表倒数第k个节点
在面试的时候遇到的手写代码题目,删除倒数第k个节点,需要先处理链表长度小于k、倒数第k个节点刚好是第1个节点、链表为空、k值小于等于0的情况。然后方法的话是先用找到第k个节点的方法找到倒数第k-1个节点,这样子删除这个节点的下一个节点就可以了。 实际上只需要实现remove_n函数,这里的代码增加了对链表的初始化、内存释放以及打印函数,让结果可以直观的看出来,代码也能够直接运行。...原创 2019-10-12 10:01:50 · 721 阅读 · 0 评论 -
More Effective C++:自增与自减操作符的重载
在C++中,自增与自减均有前缀形式与后缀形式。int i = 0;++i; // 自增前缀形式i++; // 自增后缀形式--i; // 自减前缀形式i--; // 自减后缀形式 总所周知,前缀与后缀的区别就是前缀是直接操作后再返回,而后缀则是先用临时对象保存旧值,增加旧值后再返回之前的临时对象。即有:i = 0...原创 2019-10-08 19:43:37 · 186 阅读 · 0 评论 -
Effective C++:初始化列表
C++中初始化成员变量有两种方式:一种是在构造函数体内对成员变量初始化;另一种则是初始化列表方式,就是跟在构造函数后面用于初始化指定成员变量的列表。两种初始化方式如下:class Test {public: // 初始化列表初始化_mem成员变量 Test(int mem) : _mem(mem) {} // 一般的构造函数 Test(int me...原创 2019-10-06 22:03:22 · 246 阅读 · 0 评论 -
More Effective C++:隐式类型转换与explicit关键字
1. 隐式类型转换 C++编译器能在两种数据类型之间进行隐式转换(implicit conversion),它从C语言继承过来的转换方法,例如char隐式转换为int和short转换为double之类的,对于用户自定义类型,则可以自己提供函数让编译器进行隐式类型转换。 通过单参数构造函数(single-argument constructors)和隐式类型转换运算符两种方式,我...原创 2019-10-06 18:28:34 · 296 阅读 · 0 评论 -
Effective C++:虚函数参数默认值
在C++中,对象分为静态类型(static type)和动态类型(dynamic type)。静态类型就是在程序中被声明时所采用的类型;而动态类型则是指“目前所指对象的类型”,它可以表现出一个对象将会有什么行为。class Shape {public: virtual display(int i = 4) { std::cout << "in S...原创 2019-10-05 23:12:21 · 274 阅读 · 0 评论 -
C++:map、hash_map、unordered_map
面试经常被问的问题之一,便是map和hash_map的区别,以及什么时候用map什么时候用hash_map。另外也了解到还有C++11的unordered_map,所以这里一并介绍三个了。用法就不介绍了,主要介绍区别。1. 三者的区别 map底层是用红黑树实现的,空间复杂度为O(n),是随着节点的增加才增加,而查找的时间时间复杂度则固定是O(log(n))了。因为红黑树本来...原创 2019-07-10 20:39:12 · 6758 阅读 · 0 评论 -
C++:const_cast
const_cast是一个运算符,和dynamic_cast、static_cast、reinterpret_cast一样都是用于类型的转换的,本来想将这四个一起写的,但是查了const_cast相关的资料,发现const_cast可以牵扯到的也不少,所以单独用一篇博客说明了。1. 用法 const_cast的作用很简单,就是去除或增加类型中的const属性或volatil...原创 2019-07-09 20:41:48 · 1365 阅读 · 2 评论 -
C++11 之 std::function、std::bind、std::placeholders
在公司说的项目代码中看到了std::function、std::bind、std::placeholders三个C++11的特性,通过了解之后,发现还是挺有用的,在这里记录下吧。似乎这三个特性一般都是一起使用的,所以也一起讲了。 三个特性都在functional文件中定义,故使用时需要“#include<functional>”1.基础介绍 这里...原创 2019-06-03 22:48:45 · 5275 阅读 · 3 评论 -
Protobuf 编码及序列化的记录
工作中用到了protobuf,然后之前在面试的时候面试官就问了一个问题,如果将int32类型的字段的值设置为0,那还会将该值进行序列化吗?当时是懵了的,因为自己还没有研究这部分。当时给的结果是不会,猜测protobuf中int32的默认值是0,既然默认值是0的,那应该就不会进行序列化了。 那次面试之后就觉得自己应该了解一下这部分了,结果这两天了解完之后,发现自己猜错了。好记...原创 2019-06-02 18:40:16 · 7273 阅读 · 1 评论 -
面试:字符串相关(二)
这里是面试常见的字符串相关题目。1. 删除字符串的空格,并返回空格的个数。 不断将后面非空格的字符拷贝到前面即可,这样子只需要遍历一次即可,返回值按照实际题目要求调整。#include <stdio.h>#include <string.h>int delwhitespace(char *str){ char *tmp...原创 2019-06-06 15:31:24 · 205 阅读 · 0 评论 -
面试:字符串相关(一)
这里是面试常见的字符串相关题目。 该文章主要将strcpy、memcpy、memmove三个。1. strcpy strcpy的返回值是目的字符串的地址,可以实现链式语法。#include <stdio.h>#include <string.h>char *mystrcpy(char *dst, char *s...原创 2019-06-06 15:19:56 · 153 阅读 · 0 评论 -
STL各容器底层数据结构总结
看了《STL源码剖析》,对于里面的容器,下面进行了简单的总结。1.vector: 底层使用数组保存。push_back时若已经满了,则会2*n扩展空间,若实际元素数量低于分配空间的1/4,则会将空间回收为原来的一半。《STL源码剖析》里面没有讲到空间的回收,是之前查找资料时看到。调整空间时,是先申请新的空间,然后将旧空间的内容拷贝过去,然后再释放旧的空间。 只适用于快...原创 2019-05-28 19:38:39 · 581 阅读 · 0 评论 -
STL中的Traits技法记录
看过《STL源码剖析》的人,一定会知道里面讲到的Traits编程技法。刚开始看到书上这部分的介绍的时候,是有点不太理解这个技法的作用的,但是经过网上找资料了解之后,并且反复看了书上的内容之后,才渐渐了解到这个技法的重要性,对于迭代器及泛型思维的重要性。一句话简述这个技法的主要作用,就是:可以通过迭代器的某个操作,直接获取迭代器里面保存的容器的元素类型。如果没有Traits技法,是无法实现这个操...原创 2019-05-27 23:20:02 · 417 阅读 · 0 评论 -
new(p) T1(value) 的操作
最近开始看《STL源码剖析》,看到空间配置器的时候,发现这么一段代码:template <class T1, class T2>inline void _construct(T1* p, const T2& value) { new(p) T1(value); // placement new. invoke ctor of T1}通过...原创 2019-05-09 21:04:21 · 3929 阅读 · 4 评论