在Windows平台,如果不指定bom头的话,是不清楚当前是什么编码格式的,如果我们在代码中使用了中文,系统根本不知道是utf-8 还是unicode-16,而对Linux来说,默认就是utf-8,所以写中文没关系。
现在VS已经可以支持utf-8 without BOM的源码编译了,VS2015 update2之后就支持附加编译选项/utf-8,支持直接输出中文。 /utf-8 (Set Source and Executable character sets to UTF-8)
在Windows平台,如果不指定bom头的话,是不清楚当前是什么编码格式的,如果我们在代码中使用了中文,系统根本不知道是utf-8 还是unicode-16,而对Linux来说,默认就是utf-8,所以写中文没关系。
现在VS已经可以支持utf-8 without BOM的源码编译了,VS2015 update2之后就支持附加编译选项/utf-8,支持直接输出中文。 /utf-8 (Set Source and Executable character sets to UTF-8)
看到这道题目的第一反应,HashMap,但100亿真的太多了,我不可能在内存中建立一个这个大的HashMap。
这里面需要的操作是
查找的时候因为是哈希,所以不需要遍历匹配,所以这块消耗不大。
但内存就否决了方案。
一个优化思路是 计算出hash之后%1000,这样可以分成1000个文件夹,这次每次处理其中一个文件夹就好。
但这里也要问题
还有一个思路,就是外部排序,然后逐个比较,但外部排序100亿个,O(NlogN),而且也不能一次加载到内存中。
从知乎一个回答上看可以用布隆filter,而这又是redis里的概念,所以
1 | mapreduce redis是怎么实现的呢? |
server code
import socket
if __name__ == '__main__':
mySocket = socket.create_server(('10.4.204.21', 2000), reuse_port=False)
while True:
pass
client code
import socket
if __name__ == '__main__':
i = 0
while True:
mySocket = socket.create_connection(('10.4.204.21', 2000))
if mySocket is None:
print("create client connect failed")
break
else:
print("create client connection succeed")
i = i + 1
print('current connection count ', i)
可以创建连接,但存在几个现象
《C++ Concurrency In Action》
《Concurrency With Modern CPP》
在一般的理念中,并发是指 多个thread 请求同一个CPU资源,需要来回切换context;并行是指 每个thread 跑在单独的CPU核上。
在我的工作实践和理解中, 并行是指充分利用CPU多核优势,将代码分解成可以同时运行的模块,当然这里可以同时运行,并不意味着线程间完全没有交互或者耦合,实际工作中我遇到的基本上线程间还是要访问共享内存的,很少遇到那种[0,10e8]相加这种可以完全没有耦合的情况。
并行可以分成两种:
1 | class Test{ |
为什么拷贝构造函数不能写成1的形式,必须写成2 的形式?
在面试或者被面试过程中收集的面试题目,不仅仅与C++相关,还有数据结构和算法,系统等等。
C++
_如何让两个shared_ptr指向同一个实例_
enable_shared_from_memory
今天听面试人说的,以前真没考虑过
只在堆或者栈上创建对象
只在堆上 : operator new()=delete
只在栈上 : private ~base();
static成员变量不能在类内部初始化吗
Case 1
1 | static const int m_iCount = 100; //OK |
Case 2
1 | class base{ |
对m_bObject没有进行类外初始化,但好像也没有调用base的构造函数。
Case 3
1 | class base{ |
对m_bObject没有进行类外初始化,但好像也没有调用base的构造函数,难道static成员可以不同初始化,除非要使用?
Case 3
1 | class base{ |
1 | class base{ |
这里有两个问题
从上面可以总结得出
题目
A string S of lowercase English letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
Example 1:
Input: S = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Explanation:
The partition is "ababcbaca", "defegde", "hijhklij".
This is a partition so that each letter appears in at most one part.
A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts.
Note:
在Python的数据类型中,根据是否可改变,分为mutable与immutable。
那么跟C/C++相比,所谓的不可修改是什么意思?
下面我们针对tuple来写几个例子。
不能进行单个元素的赋值操作
a = (1, 2)
a[0] = 2 #error
上面这句话会报 TypeError: ‘tuple’ object does not support item assignment.
对变量进行整体赋值
1 | a = (1, 2) |
上面的例子中,我们可以整体赋值,甚至可以用+=,那为什么=不能用,+=可以了。
先拿a = (-2, -1)来说,(-2, -1)相当于生成一个临时对象,绑定到a上。
同样+=相当于 a = a + (-1, 4),a + (-1, 4)组成新的临时对象绑定到a上。
通过id(a)我们可以看到内存的变化(这不是真正的内存地址,但可以看做与内存一致的一个概念)
也就是说,Python所谓的immutable,是说对象目前所绑定的id所指向的内容上不可修改,如果id改了,那么内容自然是可以被修改的。
修改shape会改变对象的内容或者地址吗
我们上面修改了变量的shape,此时变量的内容是没有改变的,我们打印id(a)的值是没有变化的。
开发语言与系统架构无关,在学习使用C++的时候我们就接触过多线程编程,后面随着处理器多核的出现,有了并行编程,这两个还存在着很大的区别。
说一下我所理解的多线程编程
举个人脸检测的例子
graph LR; 视频流-->| 检测 |人脸信息; 人脸信息-->| 后处理 |处理过的人脸信息; 处理过的人脸信息-->| 显示 |上层回调;
在实际的操作中,我们可以把所有需要处理的视频流保存下来,然后传递给算法引擎,然后得到所有的人脸信息,然后对每一帧的人脸信息进行统一处理,然后再一帧帧返回结果。但这样做效率很低。
我们可以试着这么做,开一个线程A,用于获取视频帧;再开一个线程B,用于算法检测;再开一个线程C,用于回调显示。
这样做的好处是,我拿到一帧视频,放到buffer里(这里甚至可以设定双buffer)。
vsync