C++11新特性及C++注意事项

  • 2019-03-09
  • 299
  • 0

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;

 

评论

还没有任何评论,你来说两句吧

发表评论

冀ICP备19026961号