C++11新特性及C++注意事项
C++11新特性
1. 同步互斥锁及多线程
(后续补充)
- std::lock_guard
- std::mutex
- std::thread
- std::atomic
- std::chrono
2. STL容器中emplace函数
在C++11中新引入了emplace系列函数,emplace_front、emplace和emplace_back,这些操作分别对应push_front、insert和push_back。
emplace与insert的不同在于:
- emplace是构造新对象,参数会传递给元素的构造函数emplace函数的参数根据元素类型而变化,参数必须与元素类型的构造函数相匹配
- insert/push是拷贝对象,把对象拷贝到容器中。
(据说)emplace比insert在速度上有了很大的提升。
3. auto关键字
这个改变已经很熟悉了,ACM比赛中非常常用。
在C++11中,auto关键字可用于自动类型识别,以及STL容器的迭代。
example 1:
auto i = 3.5
相当于
double i = 3.5
尤其对于结构体或嵌套层数较多时,可以不用刻意地去思考其数据类型是什么。
example 2:
std::set<int> st;
for (auto item : st) {
std::cout << item << std::endl;
}
相当于
std::set<int> st;
std::set<int>::iterator it;
for (it = st.begin(); it != st.end(); it++) {
std::cout << *it << std::endl;
}
编写代码时比使用迭代器轻松了不少,看起来也更加整洁清晰。
4. 原生字符串
在旧版本的C/C++中,当我们的字符串中恰巧出现了很多转义字符时(比如,文件路径),会非常麻烦(如,要将\
全部转换为\\
,等等)。
有的时候还会拿来当做比赛题目(逃
C++11中的原生字符串功能就显得非常便捷。
old_str = "C:\\Program Files\\Microsoft.NET\\ADOMD.NET";
new_str = R"(C:\Program Files\Microsoft.NET\ADOMD.NET)";
原生字符串的格式是:由大写字母R开头,双引号和括号包围。它有以下两种写法(即,引号和括号之间带与不带(必须是相同的)修饰符):
str = R"(this is the string)";
str = R"other(this is the string)other";
C++基础知识、注意事项
1. 在C++中不建议使用宏,应尽可能地使用const常量或inline内联函数代替
example 1.
#define PI 3.14 ==> const double PI = 3.14
使用const的优势是编译器会进行类型检查,避免不必要的错误
example 2.
#define SQR(x) x*x
当我们调用SQR(x+1)
时,由于宏是单纯的字符串替换,所以执行的是x+1*x+1
,而不是我们想象中的(x+1)*(x+1)
好,我们对其进行完善,给它加上括号
example 3.
#define SQR(x) ((x)*(x))
当我们调用SQR(x++)
时,它执行的是((x++)*(x++))
,x++被执行了两次,这显然也不是我们想要的答案
因此,使用inline内联函数是一个明智的选择!
2. C/C++宏中#和##的用途
#define a(x) tree##x
#define b(x) #x
/* ------------- */
int tree1 = 10;
cout << a(1) << endl; // cout << tree1 << endl;
cout << b(test) << endl; // cout << "test" << endl;
发表评论