C++基础知识相关的题目汇总

对象和类

1.为什么在创建类对象时,既可以通过初始化的方式,也可以通过赋值来设置对象的值,应采用初始化的方式?

注:两种区别:

Stock stock1 = Stock(“Boffo Objects”,2,2.0); // 通过构造函数初始化stock1对象。
stock1 = Stock(“Nifty Foods”,10,50.0); //  通过赋值的方式给stock1对象以值

答:这两者有本质区别。第一种通过初始化的方式创建指定值的对象,可能会创建临时对象(也可能不会);第二条语句时赋值语句,像这样的赋值语句使用构造函数总会导致在赋值前创建一个临时对象。因此,当两种方式都可以设置对象值的时候,采用初始化的方式效率更高。

2 为什么按值传递类对象会导致调用析构函数,而按引用传递不会?

按值传递的时候,先调用类的复制构造函数,重新复制了这个类对象,然后又因为复制的变量作用域在函数中,函数执行完就会失效,所以会调用析构函数。
【类的复制构造函数,Class(const Class &) 在C++primer十二章讲解直接使用new,delete动态管理类成员内存分配的时候,涉及到这个问题,因为没有显式声明类复制构造函数,导致复制的类对象没有修改静态类成员,而复制的类对象作用结束时却会调用析构函数,从而修改静态类成员,导致了灾难性结果。】

数组

数组和sizeof

int GetSize(int data[])
{
	return sizeof(data)	;
}
int _tmain(int argc,_TCHAR* argv[])
{
	int data1[] = {1,2,3,4,5};
	int size1 = sizeof(data1);
	int* data2= data1;
	int size2 = sizeof(data2);
	int size3 = GetSize(data1);
	printf("%d,%d,%d",size1,size2,size3);
}

有关于这个问题的输出是什么?我对于数组求sizeof的一些模糊概念在这里总结一下。
输出分别是20,4,4。data1是一个数组,sizeof(data1)是求数组的大小,这个数组包含5个整数,每个整数4个字节,所以共占用20个字节。data2声明为指针,尽管他指向了数组data1的第一个数字,但是他的本质仍然是一个指针,在32位系统上,对任意指针求sizeof,得到的结果都是4.[64位系统中都是8]。在C/C++中当数组作为函数参数进行传递时,数组自动退化成同类型的指针,所以size3的结果也是4。

vector

1 push_back()在vector的末尾插入一个元素
2 insert(arg1,arg2,srg3)可以将vector合并

关于vector容器的应用,如果在vector末尾插入一个元素直接用a.push_back(b)即可,但是递归调用每次返回的都是一个vector,需要将整个vector插入到res最后,所有使用insert()函数。res.insert(res.end(),temp1.begin(),temp1.end());

3 一维vector数组初始化

方式一:全部初始化为0

 //vector<T> v(n)形式,v包含n 个值初始化为0的元素
 vector<int> ivec2(10);

在这里插入图片描述
方式二:全部初始化为某个值

 //vector<T> v(n,i)形式,v包含n 个值为 i 的元素
 vector<int> ivec(10,0);

全部初始化为1
在这里插入图片描述
方式二:用一个数组给另一个数组初始化

 //vector<T> v(v1)形式,v是v1 的一个副本
 vector<int> ivec1(ivec);

新的arr的值为1,2,3,4,5,6,7,8,9,10
在这里插入图片描述
方式四:用数组初始化

 //数组初始化vector
 int iarray[]={1,2,3,4,5,6,7,8,9,0};
 //count: iarray数组个数
 int count=sizeof(iarray)/sizeof(int);
 //int数组初始化 ivec3
 vector<int> ivec3(iarray,iarray+count);

方式五:用 back_inserter 函数

//用 back_inserter 函数
	vector<int> ivec4; //空对象
	fill_n(back_inserter(ivec4), 10, 3); //10个3 填充ivec4.

方式六:memset()
注意:memset填充方式是以1字节为单位对内存进行填充,使用memset()初始化数组为0或者-1,都是我们想要的结果,其他的就不是,这是个坑。

memset(vec.data(), -1, vec.size()*sizeof(int));
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << " ";
	}
	cout << endl;
二维vector一定要初始化
vector<int> arr(rows);
for(int i=0;i<rows;i++)
	arr[i].resize(cols);

vector和相应类型的指针空间分配

用string习惯了,转换为char踩了很大的坑,char是不能够直接赋值的,一定要先分配空间,然后再将const char*复制过去,因此又有了接下来一个坑。
对指针类型分配空间的时候,使用new关键字,需要多大的空间给多大空间就可以了,但是用vector的时候都是 vector ivec2(10);括号中10就代表了字符数组的大小,然后习惯性给char*这样分配空间char*ch = new char(str.size()+1);,emmm,然后就是一直报错啊啊啊啊,new char(str.size()+1)中括号表示就分配一个空间,该空间上的值为括号中的内容!
所以正确的初始化为char*ch = new char[str.size()+1];,啊,太过分了……

输入输出

C++在处理输入输出的时候相对于C语言在形式上简单了很多,但是效率相对较低。
C语言针对不同的流源处理方式不一样,例如在标准输入(键盘)输出(显示器)上,几种处理方式如下:【链接的文章写的很详细也很容易弄明白
而C++对于不同的流源流目标操作都是一样的,如第二个图所示。
在这里插入图片描述
在这里插入图片描述

关于二者的效率,平时差距可能不明显,但是数据量大的时候,差距很大,在字节跳动的一道笔试题目中,用cin cout只能通过70%的测试用例,因为超时了,而用scanf 和 printf则可以通过全部测试用例。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
struct nn{
	int x,y;
}qq[500005];
bool cmp(nn a,nn b){
	return a.y>b.y;
}
int main(){
	int n,ans=0,maxx=-1;
	cin>>n;
	for(int i=0;i<n;i++)
		//scanf("%d%d",&qq[i].x,&qq[i].y);
        cin>>qq[i].x>>qq[i].y;
	sort(qq,qq+n,cmp);//对y坐标比较
	for(int i=0;i<n;i++)
		if(qq[i].x>maxx){
			//printf("%d %d\n",qq[i].x,qq[i].y);
            cout<<qq[i].x<<" "<<qq[i].y<<endl;
			maxx=qq[i].x;//更新最大的y坐标
		}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值