CPP高级
1.函数对象优化
用临时对象初始化同类型新对象 时候,直接构造,不产生临时对象。
1.函数参数传递过程中,对象优先按照引用传递,不要用值传递
2.函数返回对象时候,直接返回临时对象,不要返回定义过的对象
3.接受返回值是对象的函数调用的时候,应该按照初始化的时候接收,不要按照赋值方式接收。
2.右值引用
左值:有内存、有名字 ,右值:没名字(临时量)、没内存、常量
给成员方法提供右值引用可以提升运行效率
int a = 10;
int &b = a; //左值:有内存、有名字 ,右值:没名字(临时量)、没内存
int &&c = a; //错误,无法将左值绑定到右值引用
int &&d = 20;//右值引用右值
Cmystring &&e = Cmystring("aaa");//临时量是右值
//一个右值引用本身是一个左值
移动语义move
move(val) //左值转换为右值引用
foward(val) //类型完美转发,能够识别左值或者右值类型
3.cpp11标准
3.1 关键字语法
auto:右值自动推导
nullptr:指针专用,能够和整数进行区别
foreach:可以遍历容器,for(int x:num)
右值引用:move(),forward()
模板新特性:typename ... A (可变参数)
3.2 绑定器和函数对象
function:函数对象
bind:绑定器
lambda表达式
3.3 智能指针
shared_ptr 和 weak_ptr
3.4 容器
unordered_set、unordered_map
array:数组固定大小
forward_list:前向链表
4.emplace_back
在C++中,emplace_back()
和push_back()
是用于向容器的尾部添加元素的成员函数,但它们有一些区别。
push_back()
函数将一个元素副本追加到容器的末尾。这意味着在将元素插入容器之前,必须创建该元素的副本。这对于类似整数、浮点数和指针等简单类型的元素来说是很方便的。
std::vector<int> myVector;
myVector.push_back(10); // 添加 10 到向量末尾
myVector.push_back(20); // 添加 20 到向量末尾
emplace_back()
函数与push_back()
函数类似,但它使用给定的参数在容器的末尾直接构造一个新元素。这意味着可以直接将参数传递给元素的构造函数来创建元素,而不需要创建副本。这对于复杂的对象类型非常有用,可以避免不必要的对象复制和降低性能开销。
struct MyObject {
int data;
MyObject(int value) : data(value) {
std::cout << "Constructor called with value: " << value << std::endl;
}
};
std::vector<MyObject> myVector;
myVector.emplace_back(10); // 直接构造 MyObject 对象并添加到向量末尾
myVector.emplace_back(20); // 直接构造 MyObject 对象并添加到向量末尾
使用emplace_back()
函数可以在不创建额外副本的情况下,直接在容器尾部构造对象。这在性能要求高的情况下,能够降低开销并提高效率。