c++11基础
文章目录:
- c++11简介
- 统一的列表初始化
- {}初始化
- std::initializer_list
- 声明
- auto
- decltype
- nullptr
- 范围for循环
- STL中的一些变化
- array
- forward_list
- unordered_map和unordered_set
- 字符串转换函数
c++11简介
- 在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。
- 不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
- 从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。
- 相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多。
在这里只对部分c++11的语法进行讲解,若需要了解更多的语法,可以查看c++的官网:https://en.cppreference.com/w/cpp/11。
小故事:
1998年是C++标准委员会成立的第一年,本来计划以后每5年视实际需要更新一次标准,C++国际标准委员会在研究C++ 03的下一个版本的时候,一开始计划是2007年发布,所以最初这个标准叫C++ 07。但是到06年的时候,官方觉得2007年肯定完不成C++ 07,而且官方觉得2008年可能也完不成。最后干脆叫C++ 0x。x的意思是不知道到底能在07还是08还是09年完成。结果2010年的时候也没完成,最后在2011年终于完成了C++标准。所以最终定名为C++11。
统一的列表初始化
{}初始化
在 c++98 中,标准允许适用花括号 {} 对数组或者结构体元素进行统一的列表初始值设定。比如:
struct Point {int _x;int _y;
};int main()
{// 使用{}对数组进行初始化int array1[] = { 1,2,3,4,5,6,7 };int array2[7] = { 0 };// 适用{}对结构体元素进行初始化Point p = { 5,7 };return 0;
}
在 c++11 中,扩大了用大括号 {} 括起的列表(初始化列表)的使用范围,使其可以用于所有的内置类型和用户自定义的类型。使用初始化列表时,可以选择添加等号(=),也可以选择省略。
struct Point {int _x;int _y;
};int main()
{// 自定义类型初始化int x = { 10 };double f = { 3.14 };// 用户自定义初始化Point p1 = { 3,5 };// 使用等号的初始化列表int y = { 5 }; // -> int y = 5Point p2 = { x = 3,y = 7 }; // 可以使用等号指定成员变量的初始化// 省略等号的初始化列表int z{ 7 }; // -> int z = 7Point p3{ (3,1),(5,8)};// c++11中列表初始化也可以用于new表达式(c++98不可用)int* p1 = new int[5]{ 0 };int* p2 = new int[5]{ 1,2,3,4,5 };return 0;
}
在 c++11 及之后的标准中,创建对象时也可以使用初始化列表的初始化方式调用构造函数进行初始化。
class Date
{
public:Date(int year = 2025, int month = 1, int day = 1):_year(year), _month(month), _day(day){cout << "Date(int year, int month, int day)" << endl;}
private:int _year;int _month;int _day;
};int main()
{// c++11指出的列表初始化,这里会调用构造函数初始化Date d1 = { 2023,5,10 };Date d2{ 2023,5,11 };Date d3{ (2023,5,13),(2023, 5, 12) };// 更多的示例std::vector<int> v = { 1,2,3,4,5,6,7 };std::pair<int, std::string> myPair = { 1,"test" };std::map<int, std::string> myMap = { {1,"onw"},{2,"two"} };return 0;
}
注意:使用列表初始化方式调用构造函数时,如果构造函数参数列表与提供的初始化列表不匹配,会导致编译错误。因此,确保构造函数的参数与初始化列表的类型和数量相匹配非常重要。
std::initializer_list
c++11 中引入了 std::initializer_list ,它是一种特殊的模板类,用于表示初始化列表。它提供了一种便捷的方式来传递和处理任意数量的值。std::initializer_list 可以用于函数的参数和构造函数的参数,使得函数和构造函数能够接受任意数量的值作为初始化参数。

std::initializer_list 的成员函数如下:
begin():返回一个指向初始化列表第一个元素的迭代器。end():返回一个指向初始化列表最后一个元素的下一个位置的迭代器。size():返回初始化列表中的元素个数。
成员变量使用示例:
#include <initializer_list>
#include <iostream>
using namespace std;int main()
{initializer_list<int> nums = { 1,2,3,4,5,6,7 };// 使用begin()和end()进行迭代器遍历for (auto it = nums.begin();it != nums.end();++it)cout << *it << " ";cout << endl;// 使用范围for进行遍历for (const auto& num : nums)cout << num << " ";cout << endl;// 使用size()获取元素个数cout << "size:" << nums.size() << endl;return 0;
}
使用 auto 关键字定义一个遍历变量来接收一个大括号括起来的列表时,变量的类型将被推导为 std::initializer_list:
#include<initializer_list>
#include<iostream>
#include<typeinfo>int main()
{auto il = { 10,20,30 };std::cout << typeid(il).name() << std::endl;return 0;
}
运行结果如下:

initializer_list 的使用:在以下代码中,PrintValues 函数和 Print 的构造函数都接受 std::initializer_list 作为参数。这使得我们可以通过 {} 将值传递给函数或构造函数,而不需要显示地创建和填充一个容器。
// 函数接受初始化列表作为参数
void PrintValues(initializer_list<int> values)
{for (const auto& value : values)cout << value << " ";cout << endl;
}// 类的构造函数接受初始化列表作为参数
class Print
{
public:Print(initializer_list<int> values){for (const auto& val : values)cout << val << " ";cout << endl;}
};int main()
{// 使用初始化列表调用函数PrintValues({ 1, 2, 3, 4, 5, 6, 7 });// 使用初始化列表调用构造函数Print p = { 5,4,3,2,1,0 };return 0;
}
c++98 中不支持直接使用列表对容器进行初始化,在 c++11 后引入了 initializer_list 之后才支持的。
在 c++11 中,为了支持使用列表进行容器的初始化,相应的容器类型增加了构造函数,这些构造函数接受 std::initializer_list 作为参数。通过这个构造函数,容器便可以接受列表中的值进行初始化。

http://www.cplusplus.com/reference/vector/vector/vector/
http://www.cplusplus.com/reference/map/map/map/
http://www.cplusplus.com/reference/vector/vector/operator=/
当使用列表对容器进行初始化时,编译器会识别列表为 std::initializer_list 类型,并调用容器的相应构造函数来进行初始化。
在C++11中,容器类型(如std::vector、std::map等)为了支持使用列表进行初始化,添加了接受 std::initializer_list 作为参数的构造函数。这个构造函数的作用是遍历 std::initializer_list 中的元素,并将它们依次插入到要初始化的容器中。
使之前模拟显示的 vector 也支持 {} 初始化和赋值
namespace myVector
{template<class T>class vector {public:typedef T* iterator;// 使用 initializer_list 进行初始化vector(initializer_list<T> l){_start = new T[l.size()];_finish = _start + l.size();_endofstorage = _start + l.size();iterator vit = _start;/*typename initializer_list<T>::iterator lit = l.begin();while (lit != l.end(){*vit++ = *lit++;}*/for (auto e : l)*vit++ = e;}// 使用 initializer_list 进行赋值操作vector<T>& operator=(initializer_list<T> l){// 创建临时 vector 对象进行初始化vector<T> tmp(l);// 交换当前 vector 和临时 vector 的资源std::swap(_start, tmp._start);std::swap(_finish = tmp._finish);std::swap(_endofstorage, tmp._endofstorage);return *this;}private:iterator _start;iterator _finish;iterator _endofstorage;};
}
- 构造函数通过遍历初始化列表,将列表中的元素逐个赋值给容器,完成了容器的初始化操作。
- 赋值操作符重载函数通过创建临时的
vector对象来进行赋值操作,通过交换资源的方式实现了赋值的语义,从而完成了容器的赋值操作。
声明
auto
在 c++98 中,auto 是一个存储类型的说明符,用于表示变量具有局部自动存储类型。然而,在局部作用域中定义局部的变量默认就是自动存储类型,所以 auto 就没有什么价值了。
在 c++11 中,auto 关键字的用法发生了变化,废除了 auto 原本的用法。auto 被重新定义为一个用于类型推导的关键字。现代的 c++ 开发中,auto 主要用于声明变量时推导其类型,而不是用于存储类型的说明。
使用 auto 进行类型推断时,要求进行显示初始化,让编译器根据初始值来确定变量的类型。并将其设置为相应的类型,这样可以简化代码的书写,减少类型重复,提高代码的可读性。
auto 使用示例:
class Print
{};int main()
{auto x = 7; // x的类型被推导为intauto str = std::string("abc"); // str的类型被推到为std::stringauto ptr = new Print(); // ptr的类型被推导为Printint i = 9;auto p = &i;auto pf = strcpy;cout << typeid(p).name() << endl;cout << typeid(pf).name() << endl;map<string, string> dict = { {"sort","排序"},{"insert","插入"} };auto it = dict.begin();return 0;
}
自动类型推导可以减少代码中的重复和冗余,提高代码的可读性和可维护性。它还可以帮助我们避免手动指定类型可能导致的错误,提高代码的安全性和可靠性。
自动类型推导在某些场景下还是非常必要的,因为编译器要求在定义变量时必须先给出变量的实际类型,若我们自己指定,某些场景下可能会出现问题,如下:
int main()
{short a = 32000;short b = 32000;short c = a + b;return 0;
}
在上述示例中,由于 a 和 b 都是 short 类型,它们相加的结果可能会超出 short 类型的范围,导致数据丢失。若我们手动将 c 声明为 short 类型,就会发生截断错误。这时,使用自动类型推导就可以解决这个问题。可以将 short c = a + b 改为 auto c = a + b。编译器根据表达式的结果推导实际类型,以确保数据不会丢失。
注意:在一些情况下,显示指定类型是必要的,特别是当需要精确控制变量的类型或避免意外的类型转换时。在使用自动类型推导时,需要注意代码的清晰性和可读性。
decltype
关键字 decltype 将变量的类型声明为表达式指定的类型。
decltype 的语法形式为 decltype(expression),其中 expression 是要推断的类型的表达式。
template<class T1, class T2>
void func(T1 t1, T2 t2)
{decltype(t1 * t2) ret;cout << typeid(ret).name() << endl;
}int main()
{const int x = 1;double y = 8.7;decltype(x * y) ret;decltype(&x) p;cout << typeid(ret).name() << endl; // doublecout << typeid(p).name() << endl; // int const *func(1, 'a'); // intfunc(3, 5.5); // doublereturn 0;
}
decltype 除了能够推断表达式的类型,还能推断函数的返回值类型以及指定函数的返回类型。
template<class T1, class T2>
// 推导函数的返回值类型
auto foo(T1 x, T2 y)
{return x + y;
}template<class T1, class T2>
// 指定函数的返回类型
auto mul(T1 x, T2 y)
{decltype(x * y) ret;ret = x * y;cout << typeid(ret).name() << endl;return ret;
}int main()
{decltype(foo(1, 2)) ret1;cout << typeid(ret1).name() << endl; // intdecltype(foo(1.1, 2.2)) ret2;cout << typeid(ret2).name() << endl; // doubledecltype(mul(4, 5)) ret3;cout << typeid(ret3).name() << endl; // intdecltype(mul(4.4, 5.5)) ret4;cout << typeid(ret4).name() << endl; // doublereturn 0;
}
decltype 在泛型编程和模板元编程中特别有用,它可以推断出表达式的准确类型,从而进行类型转换,类型推导和模板类型参数的推导。它使得代码更加灵活和通用,可以处理多种类型的表达式。
nullptr
由于 c++ 中 NULL 被定义成字面量 0,这样就可能带来一些问题,因为 0 既能表示指针常量,又能表示整形常量。出于清晰和安全的角度考虑,c++11 中新增了 nullptr,用于表示空指针。
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */
以下是使用 nullptr 的一些示例:
// 通过函数返回值表示失败
int* findElement(int element) {// 模拟查找的过程,假设没有找到元素return nullptr;
}
int main()
{int* p1 = nullptr; // 指向整形的空指针char* p2 = nullptr; // 指向字符的空指针void* p3 = nullptr; // 指向void的空指针if (p1 == nullptr) {// 执行一些操作}int* result = findElement(78);if (result == nullptr){// 没有找到元素,执行对应操作}return 0;
}
大部分情况下使用 NULL 也不会出现什么问题,但是在一些特殊场景下用 NULL 来表示空指针就有可能会出现问题,如下:
void f(int elem)
{cout << "void f(int elem)" << endl;
}void f(int* p)
{cout << "void f(int* p)" << endl;
}int main()
{f(NULL); // -> void f(int elemf(nullptr); // -> void f(int* p)return 0;
}
该例子说明了使用 NULL 可能会导致函数重载的匹配错误。因为 NULL 实际上是一个整数值,它可以匹配整数类型的重载函数,而不仅仅是指针类型的重载函数。这可能会导致意外的函数调用和行为。使用 nullptr 可以明确地选择匹配指针类型的重载函数,并避免潜在的匹配错误。
范围for循环
在 c++98 中要遍历一个数组,可以使用如下方式:
#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> nums = { 1,2,3,4,5,6,7 };for (int i = 0;i < nums.size();i++)cout << nums[i] << " ";cout << endl;return 0;
}
对于一个有范围的集合,基于范围 for 循环可以更简洁和直观地遍历元素,避免了手动管理索引或迭代器的复杂性。
范围 for 循环的语法形式如下:
for(element_declaration:sequence)
{// 循环体
}
其中,element_declaration 是要在每次循环中声明的变量,用于存储序列中的元素值。sequenct 是要遍历的序列,可以是容器、数组或其它可迭代对象。
示例:使用范围 for 循环遍历容器的元素。
#include<iostream>
#include<vector>
using namespace std;int main()
{vector<int> nums = { 1,2,3,4,5,6,7 };// 将nums中的每个元素值乘2for (auto& e : nums)e *= 2;for (int num : nums)cout << num << " ";cout << endl;return 0;
}
范围 for 的使用条件:
范围 for 的迭代器对象必须是一个序列容器或类,并且提供 begin() 和 end() 函数来返回迭代器的范围,迭代器类型需要支持后置递增、前置递增和解引用操作符。
STL中的一些变化
c++11 标准引入了四个新的容器,它们分别是:array、forward_list、unordered_map 和 unordered_set。这些容器提供了不同的功能和性能特点,丰富了 c++ 标准库的容器选项,使得开发人员能够实际的开发场景来选择合适的容器类型。
array
array 是一个固定大小的数组容器,提供了类似于原生数组的功能,但具有更多的优势和便利性。
std::array 容器的特点:
- 固定大小:创建
array时,需要指定容器的大小使其固定。这使得array具有确定的容量,并在内存中以连续的方式存储。 - 安全性:
array提供了边界检查,确保在访问元素时不会越界。它提供了at()成员函数和重载的operator[],可以安全的访问和修改元素。 - 接口与原生数组兼容:
array支持使用下标访问元素,提供了类似于原生数组的语法和功能。 - 支持迭代器:
array提供了迭代器,允许以迭代器的方式遍历容器中的元素。 - 内置函数和算法支持:
array支持标准库的算法和内置函数。

array 容器有两个模板参数,第一个模板参数表示存储类型,第二个模板参数是一个非类型模板参数,代表数组中存储元素的个数,即 array 数组的大小。
#include<iostream>
#include<array>int main()
{array<int, 20> a1; // 定义一个可存储20个整形元素的array容器array<double, 10> a2; // 定义一个可存储10个浮点数元素的array容器return 0;
}
使用 array 可以替代原生数组,并获得更好的安全性和性能。它在需要固定大小数组的场景中比较有用。但是,array 的大小是固定的,因此不适合定义过大的数组。
forward_list
c++11 中的 forward_list 实际上是单向链表(singly linked list)的一种实现。

std::forward_list 具有以下特点:
- 单向链表:它是由节点组成的单向链表,每个节点中包含一个元素和指向下一个节点的指针。
- 前向迭代器:forward_list 允许从链表的开头到末尾顺序遍历元素。但不支持反向迭代器。
- 节省内存:单向链表只需要一个指针来连接节点,forward_list 的内存消耗低于双向链表。
- 不支持随机访问:不支持随机访问元素,无法直接访问任意位置的元素。需要访问元素只能从头开始遍历。
总结:forward_list 在插入和删除操作频繁、不需要随机访问元素的场景下具有优势。但是在需要经常查找元素或访问元素的情况下,性能可能不如支持随机访问的容器。如:vector、list等。因此,需要根据具体的场景来选择合适的容器。
unordered_map和unordered_set
std::unordered_map 和 unordered_set 是 c++11 引入的无序关联容器,它们是基于哈希表实现的容器。
unordered_set文档介绍
unordered_map文档介绍
它们有以下特点:
- 无序性:因为它们的底层是使用哈希表实现,元素的存储和访问是无序的。这使得在无需保持元素有序的场景下,可以获得高效率的插入、查找和删除操作。
- 高效查找、插入和删除操作:unordered_map 和 unordered_set 中插入,查找和删除元素的时间复杂度接近于O(1)。具体性能取决于哈希函数的质量和哈希表的负载因子。
- 基于键值的存储和查找:unordered_map 是键值对的集合,每个元素包含一个键和一个关联的值;unordered_set 是值的集合。它们可以通过键或值进行快速存储和查找。
- 哈希冲突可能影响性能:由于哈希表的特性,不同的键可能映射到相同的哈希桶,这就是哈希冲突。当哈希冲突过多时,可能会导致性能下降,因为需要处理冲突。为了减少哈希冲突,可优化哈希函数的设计和调整容器的负载因此。
unordered_map 使用示例:
#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;int main()
{unordered_map<string, string> dict;dict.insert(make_pair("sort", "排序"));dict.insert(make_pair("map", "地图"));dict.insert(make_pair("right", "右,正确的"));// 查找词库中某个单词含义cout << "sort:" << dict["sort"] << endl;// 遍历for (const auto& e : dict)cout << e.first << ":" << e.second << endl;// 删除元素dict.erase("right");return 0;
}
unordered_set 使用示例:
#include<iostream>
#include<unordered_set>
#include<string>
using namespace std;int main()
{unordered_set<int> set;set.insert(1);set.insert(3);set.insert(5);// 查找元素if (set.find(3) != set.end())cout << "Element found" << endl;// 遍历元素for (const auto& e : set)cout << e << " ";cout << endl;// 删除元素set.erase(3);return 0;
}
字符串转换函数
c++11 中提供了各种内置类型与 string 之间相互转换的函数,如:to_string、stoi、stod 等。
内置类型转换为 string
将内置类型转换为 string 类型可以调用 to_string 函数,to_string 函数为各种内置类型重载了对应的处理函数。

string类型转换为内置类型
若想要将 string 类型转换为其它的内置类型,可以调用以下函数:

相关文章:
c++11基础
文章目录: c11简介统一的列表初始化{}初始化std::initializer_list 声明autodecltypenullptr 范围for循环STL中的一些变化arrayforward_listunordered_map和unordered_set 字符串转换函数 c11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)࿰…...
Linux:centos:修改临时ip永久ip
使用 ifconfig 查看网卡信息以及ip 临时配置ip 找到要修改ip的网卡的名称(我这里使用名称为:ens33网卡) # ifconfig 网卡名 ip /子网掩码 ifconfig ens33 192.168.1.2/24 配置永久ip 去配置网卡文件 vi /vim 或 nano vim /etc/s…...
如何真正开启docker远程访问2375
注意看官方文档 Configure remote access for Docker daemon | Docker Documentation 1. windows上Docker Desktop开启远程访问端口2375 系统版本: win10专业版 Docker Desktop版本:4.18.0 很简单勾上, 应用并重启即可 2. linux上开启 尝…...
nodejs连接mysql
npm i express #node后端框架npm i corsnpm i mysqlconst app require(express)(); const cors require(cors); const port 5000; const mysql require(mysql) //引入mysql 模块app.use(cors({}))const conn mysql.createConnection({user: root,password: qwertyuiop…...
异构跨库数据同步还在用Datax?来看看这几个开源的同步方案
在遇到跨库或者异库数据同步时,我们一般都会借助ETL工具来实现数据同步功能。比如目前大家较为熟知的Kettle和Datax。但是,这两个需要定时去查询数据库的数据,会存在一定的延迟,而且,默认采用全量同步的方式࿰…...
msvcp140.dll丢失怎么办?msvcp140.dll重新安装的解决方法
msvcp140.dll是微软编译器系统中的一个动态链接库文件,它存储了许多的代码和数据,能帮助计算机程序正常运行。当系统中出现了msvcp140.dll丢失的情况时,则会出现程序无法正常运行的错误。这篇文章将为大家介绍如何解决msvcp140.dll丢失的问题…...
mysql超全语法大全
mysql安装教程 一、登录(使用可视化工具,可忽略) 打开命令行工具,输入以下命令,根据提示输入 root 用户的密码。 mysql -u root -p mysql -u root -p -D 数据库名二、创建数据库 显示数据库:SHOW DATAB…...
【VR】手柄定位技术
1. 关于Quest Pro头显、控制器的规格分析(终篇)及Quest 3分辨率 (2022年07月29日)被认为是“Quest Pro”的高端一体机Project Cambria将于今年秋季正式发布。对于一直关注和分享所述设备情报的YouTuber布拉德利林奇(B…...
TDengine 启动 taosAdapter,提供基于6041端口的RESTful 接口,建立REST 连接
一、前文 TDengine 入门教程——导读 二、开发指南 TDengine 完整的软件包包括: 服务端(taosd);命令行程序 (CLI,taos) 和一些工具软件;用于与第三方系统对接并提供 RESTful 接口的 taosAdapter࿱…...
SY8205同步降压DCDC可调电源模块(原理图和PCB)
SY8205同步buck降压电源模块,输入电压4.5-30V,输出电压0.6-30V可调,效率90%以上,最大连续输出电流5A,峰值电流6A。 开源链接:https://url.zeruns.tech/obGu3 SY8025数据手册下载地址:https://…...
电装光庭汽车电子(武汉)有限公司
电装光庭汽车电子(武汉)有限公司 (汽车座舱显示系统,汽车电子产品及其材料和组件的开发,设计,制造,销售,批发,进出口) 一、公司介绍 电装光庭汽车电子是一…...
2023年DAMA-CDGA/CDGP认证合肥/厦门/长春/深圳可以报名
DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…...
android 12.0launcher3中workspace app列表页不显示某个app图标
1.概述 在12.0的开发中,Launcher3 workspace的app列表页 会负责加载系统中app的所有图标 但针对某个不需要显示在桌面的app图标需要过滤掉 所以需要在加载和更新的时候过滤 需要更改两处地方,一处是 加在列表时 一处是安装卸载app 更新app列表时 2.launcher3中workspace ap…...
Java 编写websocket client 压测脚本
对于Java开发者而言,使用Java编写websocket client压测脚本是一件比较容易的事情。下面给出一个基于Java语言的websocket client压测脚本示例,供大家参考。 import java.net.URI; import java.util.concurrent.CountDownLatch; import org.java_websocke…...
设计模式之【备忘录模式】,“后悔药”是可以有的
文章目录 一、什么是备忘录模式1、备忘录模式使用场景2、备忘录模式优缺点3、备忘录模式的三大角色4、白箱备忘录和黑箱备忘录5、思考:备份频率快,备份对象大的备忘录应该如何设计 二、实例1、备忘录模式的一般写法2、使用栈管理富文本编辑器3、游戏状态…...
ATECLOUD云测试平台新能源电机测试系统:高效、可扩展的测试利器
随着全球对环境保护的日益重视,新能源的发展越来越受到关注。电动汽车作为新能源领域的重要组成部分,其性能和质量对于消费者来说至关重要。为了确保电动汽车的性能和质量,测试系统平台解决方案变得越来越重要。本文将介绍一种基于ATECLOUD智…...
项目随机问题笔记
一、前端项目启动的命令 启动项目依赖:npm install 安装cross-env模块:npm i cross-env --save-dev 启动报错时试试这个 npm install node-sass (安装sass) 启动项目命令1 npm run dev 启动项目命令2 npm run start 启动项目命令3 npm start 二、前…...
Linux网络编程之recv函数
功能 recv 函数的功能就是从套接字中接收数据。 头文件 #include <sys/types.h> #include <sys/socket.h>原型 ssize_t recv(int sockfd, void *buf, size_t len, int flags);参数 参数描述sockfdsocket 文件描述符buf接收数据缓冲区len接收数据缓冲区的大小f…...
ChatGPT免费使用的方法有哪些?
目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…...
【华为OD机试】找朋友【2023 B卷|100分】
华为OD机试- 题目列表 2023Q1 点这里!! 2023华为OD机试-刷题指南 点这里!! 题目描述 在学校中,N个小朋友站成一队, 第i个小朋友的身高为height[i], 第i个小朋友可以看到的第一个比自己身高更高的小朋友j,那么j是i的好朋友(要求j > i)。 请重新生成一个列表,对应…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
