首页 > 面经
头像
COffer++
编辑于 2021-04-17 11:14
+ 关注

面经

哈希表的数据结构 --数组+链表

怎么理解容器和迭代器的关系,

容器是怎么实现接口的统一 ?  --用到模板

用到了模板的什么性质?
--

didi
工作中有成就感的事情?
写了一个这样的脚本,工作中会使用shell语句较多,因为部门成立时间较短,有很多命令会重复执行,我在工作之余总结了下这些shell语句,可以一键执行好几个代码仓(如果成功就继续向下执行 ),不用人为的去移动各个代码仓生成的组件rpm包,并将含有修改的代码换到设备说,写了2天供大家使用,提高大家的工作效率

rpc通信框架?并说一下好处  相比于http https://www.zhihu.com/question/25536695
有用过程rpc框架吗
	
	
	
作者:洪春涛 链接:https://www.zhihu.com/question/25536695/answer/221638079 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
syn攻击的解决思路?

消息队列读写数据一致性的问题?
消息队列还有什么好处? -- 反压上层
不难的算法题:
最长不重复子串


utcode和utF8的区别, python 在这个上面还是有些不太友好的地方
更倾向于使用多线程还是多进程

想接触应用层的事,现在主要是IP层的事
如何自验证

百度地图
自定义的字符串类,只用写定义,不用写实现
构造、析构、拷贝构造、赋值、操作符等
class String
{
private:
	char* _ptr;
	size_t _size;
	size_t _capacity;
	static size_t npos;
public:
	String()//无参构造,开辟一个字节空间
		:_ptr(new char[1])
		, _size(0)
		, _capacity(0)
	{
		*_ptr = '\0';
	}
	String(const char* ptr)//带参构造
		:_ptr(new char[strlen(ptr)+1])
		,_size(0)
		,_capacity(0)
	{
		strcpy(_ptr, ptr); //重新开辟空间 进行字符串拷贝
		_size =_capacity= strlen(_ptr);
	}
	//此处复用带参构造开辟一个临时对象,进行交换
	String(const String& str)//拷贝构造 
		:_ptr(nullptr)
		,_size(0)
		,_capacity(0)
	{
		String tmp(str._ptr);
		Swap(tmp);
	}
	//此处复用拷贝构造创建临时对象str,进行交换
	String& operator=(String str)//赋值运算符
	{
		Swap(str);
		return *this;
	}
	const char& operator[](size_t n) const
	{
		assert(n < _size);
		return _ptr[n];
	}

	//增容,注意循环进行拷贝,释放原有空间
	void reserve(size_t n)
	{
		if (n > _capacity)
		{
			char* str = new char[n+1];//开新的空间
			//拷贝内容,这里有bug,拷贝不到 /0
			//strcpy(str, _ptr);
			for (size_t i=0;i<_size;i++)
			{
				str[i] = _ptr[i];
			}
			delete[] _ptr;
			_ptr = str;
			_capacity = n;
		}
	}
	//大于原有空间需要增容,空间够用需要用ch填充(memset函数)
	void resize(size_t n,char ch='\0')
	{
		if (n > _capacity)
		{
			reserve(n);
		}
		if (n > _size)
		{
			memset(_ptr + _size, ch, n - _size);
		}

		_size = n;
		_ptr[_size] = '\0';
	}
	//判断是否增容
	void push_back(const char& ch)
	{
		if (_size == _capacity)
		{
			size_t new_capacity=_capacity == 0 ? 15 : 2 * _capacity;
			reserve(new_capacity);
		}
		_ptr[_size] = ch;
		_size++;
		_ptr[_size] = '\0';
	}
	//析构
	~String()
	{
		if (_ptr)
		{
			delete[] _ptr;
			_ptr = nullptr;
			_size = _capacity = 0;
		}
	}
	size_t size() const 
	{
		return _size;
	}
	size_t capacity() const
	{
		return _capacity;
	}
	void Swap(String& str)
	{
		swap(_ptr, str._ptr);
		swap(_size, str._size); 
		swap(_capacity, str._capacity);
	}
	void append(const char* str)
	{
		int len = strlen(str);
		if (len + _size > _capacity)
		{
			reserve(_size+len );
		}
		//尾插字符串
		//strcpy(_ptr+_size,str);
		_ptr[len + _size] = '\0';
		while (len)
		{
			_ptr[len + _size-1] = str[len-1];
			len--;
		}
		_size += strlen(str);
	}
	String& operator+=(const char& ch)
	{
		this->push_back(ch);
		return *this;
	}	
	String& operator+=(const char* str)
	{
		this->append(str);
		return *this;
	}
	String& operator+=(const String& str)
	{
		append(str._ptr);
		return *this;
	}
	//插入一个字符
	void insert(size_t pos, const char& ch)
	{
		assert(pos <= _size);
		if (_size == _capacity)
		{
			size_t newc = _capacity == 0 ? 15 : 2 * _capacity;
			reserve(newc);
		}
		size_t end = _size;
		while (end-pos)
		{
			_ptr[ end ] = _ptr[end - 1];
			--end;
		}
		_ptr[pos] = ch;
		_ptr[++_size] = '\0';
	}
	
	//插入一个字符串
	void insert(size_t pos, const char* str)
	{
		assert(pos <= _size);
		int len = strlen(str);
		if (_size + len > _capacity)
		{
			reserve(_size + len);
		}
		size_t end = _size + len;
		while (end>pos+len-1)
		{
			_ptr[end] = _ptr[end - len];
			--end;
		}
		memcpy(_ptr + pos, str, len);
		_size += len;
		_ptr[_size] = '\0';
	}
	//删除指定位置指定长度
	void erase(size_t pos,size_t len)
	{
		assert(pos < _size&&pos>=0);
		if (pos + len >= _size)
		{
			_ptr[pos] = '\0';
			_size = pos;
			return;
		}
		size_t start = pos + len;
		while (start<_size)
		{
			_ptr[pos++] = _ptr[start++];
		}
		_size -= len;
		_ptr[_size] = '\0';
	}
	size_t find(const char& ch, size_t pos=0)
	{
		assert(pos < _size);
		while (pos < _size)
		{
			if (_ptr[pos] == ch)
			{
				return pos;
			}
			pos++;
		}
		return npos;
	}
	size_t find(const char* str, size_t pos=0)
	{
		assert(pos < _size);
		char* s=strstr(_ptr+pos, str);
		if (s)
		{
			return s - _ptr;
		}
		return npos;
	}
	typedef char* iterator;
	typedef const char* const_iterator;
	iterator begin()//第一个元素的位置
	{
		return _ptr;
	}
	iterator end()
	{
		return _ptr + _size;
	}
	const_iterator begin() const//第一个元素的位置
	{
		return _ptr;
	}
	const_iterator end() const //最后一个元素的下一个位置
	{
		return _ptr + _size;
	}
	friend ostream& operator<<(ostream& out, const String& str);
	friend istream& operator>>(istream& in, String& str);

};

C++构造函数之委托构造函数


C++ sizeof各种类型的大小



写一个字符串转整数的接口,这个接口是给很多人用的,需要比较健壮,可扩展,负数,大数也得考虑
向一个vector里push 100次,其sizeof()多大
入参用const& str  修饰有什么区别
epoll的水平和边沿触发的区别
shell命令,统计哪个词出现的次数最多
syn攻击造成了什么?
设备崩溃怎么办,怎么查崩溃的原因
会不会用gdb调试call文件,直接跳到某行,看变量的值
读写锁,读锁和写锁 谁会先抢到锁


全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

近期热帖

近期精华帖

热门推荐