C++查漏补缺

工作中发现一些细节掌握的不到位,特此记下。

1.字符数组查找指定字符

在一段字符数组中查找指定的字符串,仅使用C。
例:

char cmdline[4096] = { "core_ctl_disable_cpumask=0-7 kpti=0 mdtp console=" };
	char *ptr;
	int find = 0;
	ptr = cmdline;
	while (ptr && *ptr) {
		char *x = strchr(ptr, ' ');
		if (x != 0)
			*x++ = 0;
		if (!strcmp(ptr, "mdtp")) {
			find = 1;
			break;
		}
		ptr = x;
	}
	return find;

其中需要注意的细节点:

  • *x++ = 0;//这里是先x++再赋值0,作用是将‘ ’字符改成ASCII码为0,即‘\0’,表述字符结束。可以将ptr仅指向一个被空格分割后的字符串。
  • !strcmp(ptr, “mdtp”)。strcmp可以返回正数,负数,跟0.而负数也是数字,所以!负数为false。

2.指针指向问题

当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参。
传送门:https://blog.csdn.net/u013130743/article/details/80806179

void testchar2(char* p)
{
	*p = 'a';
	*(p+1) = 'b';
}
void testchar1(char* p)
{
	char a[100] = "ffffaaa";
	p = a;
	*(p+1) = 'b';
}

void main()
{
	char a[100] = "12132545665";
	char* b1 = a;
	char* b2 = a;
	testchar1(b1);//改变指针指向,但是没改变指针的所指的内容
	cout << a << endl;
	cout << *b1 << endl;
	testchar2(b2);
	cout <<a  << endl;
	cout <<*b2  << endl;
}

运行结果:
在这里插入图片描述

3.类初始化与赋值的区别

#include <iostream>
using namespace std;
class A {
public:
	int num1;
	int num2;
public:
	A(int a = 0, int b = 0) :num1(a), num2(b) 
	{
		cout << "param constructor" << endl;
	};
	A(const A& a) 
	{
		cout << "Copy constructor" << endl;
	};
	//重载 = 号操作符函数
	A& operator=(const A& a) {
		cout << "=" << endl;
		num1 = a.num1 + 1;
		num2 = a.num2 + 1;
		return *this;
	};
};
int main() {
	A a(1, 1);
	A a1 = a; //拷贝初始化操作,调用拷贝构造函数
	A b;
	b = a;//赋值操作,对象a中,num1 = 1,num2 = 1;对象b中,num1 = 2,num2 = 2
	return 0;
}

结果:
在这里插入图片描述

4.隐藏:派生类中的函数屏蔽了基类中的同名函数

#include <iostream>
using namespace std;
//父类
class A {
public:
	virtual void fun(int a) {
		cout << "A中的fun函数" << endl;
	}
};
//子类
class B : public A {
public:
	//隐藏父类的fun函数
	virtual void fun(char* a) {
		cout << "A中的fun函数" << endl;
	}
};
int main() {
	B b;
	b.fun(2); //报错,调用的是B中的fun函数,参数类型不对
	b.A::fun(2); //调用A中fun函数
	return 0;
}

在这里插入图片描述

5.内联函数

传送门:https://www.cnblogs.com/QG-whz/p/4641479.html

6.大小端

字数据的高低字节:左边是高位,右边是低位。
高低地址:数字越大,地址越高。例如0x0001为低地址,0x0099相对0x0001为高地址
大端存储:字数据的高字节存储在低地址中
小端存储:字数据的低字节存储在低地址中

7.unordered_set

C++ STL unordered_set容器完全攻略

  • 不再以键值对的形式存储数据,而是直接存储数据的值;
  • 容器内部存储的各个元素的值都互不相等,且不能被修改。
  • 不会对内部存储的数据进行排序

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复
在这里插入图片描述

8.map

映射底层实现是否有序数组是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可更改O(logn)O(logn)
std::multimap红黑树key有序key可重复key不可更改O(logn)O(logn)
std::unordered_map哈希表key无序key不可重复key不可更改O(1)O(1)

1)std::map

常见用法

std::map<int, int> test;
int a,=0,b=0;
test[a] = b;
auto c = test.size();
for (auto it : test){
//……
}
auto it = test.find(a);
if (it != test.end())
{
	test.erase(it );
}

遍历删除

2)std::multimap

常见用法

typedef std::multimap<uint32_t, uint32_t> t_TestMap;
std::shared_ptr<t_TestMap> spTsetMap;
spTsetMap = std::make_shared<t_TestMap>();
//插入
spTsetMap->insert(t_TestMap::value_type(a, b));
//count
auto Cnt = spTsetMap->count(a);
auto range = spTsetMap->equal_range(a);
for (auto i = range.first; i != range.second; ++i)
{
    if(i->second == a)
    {
        spTsetMap->erase(i);
        break;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值