【C++入门(一)】半小时入门C++开发(深入理解new+List+范围for+可变参数)

目录

一.深入理解new

使用格式

二.List列表

定义一个列表

迭代器

添加元素

删除元素

排序

反转序列

三.范围for

四.可变参数

std::initializer_list

[可变参数模板(variadic template)](#可变参数模板(variadic template))


一.深入理解new

类似于C语言中的malloccallocrealloc关键字,在C++中动态分配内存一般使用new关键字,其返回值是一个指向内存块的地址。

使用格式

new:

  • 类型指针 指针变量名 = new 类型名;
    • Type* variable = new Type;
  • 类型指针 指针变量名 = new 类型名(初始值);
    • Type* variable = new Type();
  • 类型指针 指针变量名 = new 类型名[元素个数];
    • Type* variable = new Type[];

delete:

  • delete 指针变量名;
    • delete variable;//释放单个空间
  • delete[] 指针变量名;
    • delete[] variable;//连续释放多个空间
cpp 复制代码
//申请内存空间
int* p = new int;
//申请并初始化
int* p = new int(1);
//申请连续10个空间,由于一个指针为4字节,所以总共4*10=40
int* p = new int[10];

//释放单个空间
delete p;
//释放多个空间,常用于数组
delete[] arr;

new对于对象的空间申请和分配有很好的效果:

cpp 复制代码
class A{
public:
    A(int a = 10){};
    ~A(){};
};

//合法但不应使用,未调用构造函数初始化
A* a = new A;
//为对象申请空间,并初始化
A* a = new A();
//在类的构造函数中有默认参数时,可以连续申请多个空间
A* a = new A[10];

delete a;

即,new去申请对象会先申请对象的空间并调用对象的构造函数完成对象的初始化;delete会先去完成对象的资源清理,再将对象所占的空间释放掉。

二.List列表

List是C++的一个序列容器,底层结构是一个带头双向循环链表 ,使用列表来 入和删除元素的效率较高,适用于频繁进行插入和删除操作 ;但不能直接通过位置(下标)来直接访问元素。想要访问list的某个元素,必须从list的一端(或已知位置)迭代到该元素。

定义一个列表

cpp 复制代码
list <typename> name;

迭代器

cpp 复制代码
list<string> a;
list<string>::iterator it;	// 迭代器

for(it=a.begin();it!=a.end();it++)
{
    string temp=*it;
    print(temp);
}

添加元素

cpp 复制代码
void push_front(const T& x);	// 头部添加
void push_back(const T& x);		// 尾部添加
insert(iterator, value);        //迭代器任意添加

删除元素

cpp 复制代码
void pop_front();		// 头部删除
void pop_back();		// 尾部删除
myList.remove(value);   //删除特定值元素
mylist.remove_if(func)  //删除满足特定条件的元素
mylist.erase(it);       //迭代器删除元素

排序

cpp 复制代码
myList.sort();//降序排列

反转序列

cpp 复制代码
myList.reverse();

三.范围for

C++11 引入一新的语法范围-based for 循环(range-based for loop),用于简化遍历容器或集合中的元素。

cpp 复制代码
//普通循环
for(表达式 1; 表达式 2; 表达式 3)
{
    // 循环体
}

// 范围for循环
for (int declaration : expression) 
{ 
    // 循环体
}

注意:

  • 适用范围广泛 :范围for循环可以用来遍历任何支持 begin()end() 函数的容器,比如 std::vectorstd::arraystd::list 等标准容器。

四.可变参数

std::initializer_list

std::initializer_list用于表示某种特定类型的值的数组,是一种模板类型。

cpp 复制代码
#include <initializer_list>

void func(std::initializer_list<int> list) 
{
    for (int a : list) 
    {
        std::cout << a << " ";
    }
    std::cout << std::endl;
}

特别注意:用initializer_list传递参数只能读,不能写!

可变参数模板(variadic template)

cpp 复制代码
template<class T, class... Args>
//template<typename T, typename... Args>
void func(const T &t, const Args&... test); 
  1. 这里的"class"和"typename"表示**"这里声明的 T 是一个类型参数"**,并非是指类。
  2. class T 告诉编译器 T 是一个类型参数。
  3. class... Args 告诉编译器 Args 是一个类型参数包,它可以包含多个类型。
相关推荐
挣扎与觉醒中的技术人1 分钟前
网络安全入门持续学习与进阶路径(一)
网络·c++·学习·程序人生·安全·web安全
滴_咕噜咕噜3 分钟前
C#基础总结:常用的数据结构
开发语言·数据结构·c#
martian6653 分钟前
【Java高级篇】——第16篇:高性能Java应用优化与调优
java·开发语言·jvm
OTWOL1 小时前
【C++编程入门基础(一)】
c++·算法
许苑向上1 小时前
Java八股文(下)
java·开发语言
菜鸟一枚在这1 小时前
深入解析设计模式之单例模式
开发语言·javascript·单例模式
独孤求败Ace1 小时前
第44天:Web开发-JavaEE应用&反射机制&类加载器&利用链&成员变量&构造方法&抽象方法
java·开发语言
计算机-秋大田1 小时前
基于Spring Boot的农产品智慧物流系统设计与实现(LW+源码+讲解)
java·开发语言·spring boot·后端·spring·课程设计
matlabgoodboy1 小时前
Matlab代编电气仿真电力电子电机控制自动化新能源微电网储能能量
开发语言·matlab·自动化
镰圈量化1 小时前
当电脑上有几个python版本Vscode选择特定版本python
开发语言·vscode·python