一:auto 和const auto&
1、auto即 for(auto x:range) 这样会拷贝一份range元素,而不会改变range中元素;
2、当只想读取range中元素时,使用const auto&。
int arr[10];
for(int i=0;i<10;i++)
{
arr[i]=i;
}
for(auto &a:arr)
{
std::cout << a;
}
输出的结果就是0—9这十个数。
for(auto &a : arr)
中“auto &a”就是变量名就和上一个for循环中的“int i” 一样,
与 for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)是一样的。
如:for(const auto&x:range),它不会进行拷贝,也不会修改range,效率会比用auto快一点
想要拷贝元素:for(auto x:range)
想要修改元素:for(auto &&x:range)
想要只读元素:for(const auto& x:range)
二:const 与&作用
const常类型作用:
形参在子函数中调用时当成一个常量来使用,既无法成为左值,无法修改形参的值。
引用(&) 作用:
如a=&b,表示a是b的别名,此时a和b的地址相同。
在子函数中调用时,形参的改变就是实参的改变,在C中需要用到指针来实现。
函数 fun(int a, int b) / fun(int& a, int& b)
void fun(int a, int b):
这样的函数调用时是不会修改传入实参的值,实参拷贝给函数形参(是另外一份在),函数中也就是以一个局部变量的形式存在,当函数结束时,变量a,b的生命周期也就结束了。
void fun(int &a,int &b):
这种形式进行参数传递,其实是一种指针的形式,如果在函数内我们改变了a,b的值,当函数结束后,传入的实参值也将被改变。
为何选择 const vector<int>& 形式
当参数是较大的数据类型时,并且不需改变原变量中的值,
我们为什么要使用 void fun(vector<int> & a), 而不用 void fun(vector<int> a) ?
void fun(vector<int> a) 需要对原变量进行一次复制操作,即使两个变量名相同但是作用域不同,所以其实是两个变量,所以需要一次复制操作,因此大数据类型复制时要耗时。
使用void fun(vector<int> &a) 不需要进行复制操作,但是需要防止在函数中改变了参数的值。所以就有了void fun(const vector<int> &a) 这样的结构,我们都知道const关键字定义的变量是不可以被改变的,所以当我们进行常量引用时既不会进行复制操作,当误操作时又不能编译通过,两全其美。
比较一下常引用和常类型的区别:
在子函数change() 中把b当做常量来使用,即右边的代码。
添加了一个&引用符的区别在哪里呢?
如左边的代码,之前说过引用的作用,此时b的地址和a的地址是相同的,在被调用函数中c=b等于c=a;被调用函数中并没有申请一个空间来存放形参b,也不用将实参a的值传给形参b,因此使程序运行更简化。
此时的b也是不可改变的,并没有破坏常类型的作用。
三:高通平台see架构案例。
static vector<unique_ptr<sensor>> get_available_accel_calibrated()
{
const vector<sensor_uid>& accel_suids =
sensor_factory::instance().get_suids(SSC_DATATYPE_ACCEL);
vector<unique_ptr<sensor>> sensors;
for (const auto& suid : accel_suids) {
if (!(sensor_factory::instance().get_settings()
& DISABLE_WAKEUP_SENSORS_FLAG)) {
try {
sensors.push_back(make_unique<accelerometer>(suid, SENSOR_WAKEUP,
SENSOR_CALIBRATED));
} catch (const exception& e) {
sns_loge("failed for wakeup, %s", e.what());
}
}
try {
sensors.push_back(make_unique<accelerometer>(suid, SENSOR_NO_WAKEUP,
SENSOR_CALIBRATED));
} catch (const exception& e) {
sns_loge("failed for nowakeup, %s", e.what());
}
}
return sensors;
}