C++面试问题精选 0513

本文涵盖了C++面试中常见的问题,包括静态成员变量与死循环的影响,多线程环境下static局部变量的初始化,vector的插入与内存管理,map的插入操作,unordered_map的哈希冲突,const关键字的作用,string的查找与转换,以及智能指针和内存管理等核心概念。
摘要由CSDN通过智能技术生成
1、有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环,可以删除 main 函数吗?

在C++中,如果你有一个类包含static成员变量,并且这个类的构造函数中包含一个死循环(即无限循环),那么这通常不是一个好的设计选择,因为这会导致任何尝试创建该类实例的操作都被阻塞。

不可以删除main函数。在C++程序中,main函数是程序的入口点。没有main函数,编译器将无法知道从哪里开始执行你的程序。即使你有一个类并且它的行为是某种后台任务或长时间运行的服务,你也需要一个main函数来启动这个程序。

2、C++,多线程访问一个函数,函数中有一个 static 局部变量,局部变量会初始化几次,有线程安全问题吗?

在 C++11 及其以后的标准中,引入了线程安全的静态局部变量初始化机制。这一机制确保当多个线程并发访问一个包含 static 局部变量的函数时,该静态变量只会被安全地初始化一次,从而避免了竞争条件。

具体机制

当一个函数包含一个 static 局部变量时,该变量的初始化是延迟到该函数第一次被调用时进行的。在 C++11 之前,如果多个线程同时调用该函数,可能会导致竞争条件,使得静态变量被初始化多次或者初始化过程出现不一致的状态。

为了避免这种情况,C++11 引入了以下机制:

  1. 一次性初始化保证:C++11 及其后的标准确保 static 局部变量在程序的整个生命周期内只会被初始化一次。
  2. 线程安全性保证:如果多个线程同时进入初始化代码段,编译器和运行时系统会确保只有一个线程执行初始化代码,其他线程会等待初始化完成。
3、vector 插入元素,扩容,缩小容量

插入元素

std::vector 插入元素可以使用以下几种方法:

  1. push_back:在 vector 的末尾添加一个元素。
  2. insert:在指定位置插入一个或多个元素。
  3. emplace_back:在 vector 的末尾原地构造一个元素。

扩容

vector的扩容通常是通过reserve()函数实现的,它会预分配一定数量的空间,以便vector可以容纳更多元素而不需要频繁地重新分配内存。

缩小容量

vector的容量可以通过shrink_to_fit()函数缩小,它会尽可能减少vector的内存占用。

C++中使用vector::resize()函数来调整vector的大小?

在C++中,vector::resize()函数用于调整vector的大小。这个函数有两个重载版本:

  1. void resize(size_type n): 此版本的resize()函数会将vector的大小更改为n。如果n小于vector的当前大小,则vector会缩小到前n个元素,并删除超出范围的元素。如果n大于vector的当前大小,则vector会在末尾插入足够的元素以达到n的大小。对于基本数据类型(如intfloat等),新添加的元素会被初始化为0。而对于类类型,如果类有默认构造函数,新添加的元素会被初始化为该默认构造函数的返回值。
  2. void resiz
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值