C++11新特性
一、原生字符串(raw string literals)
比如我们写硬盘上一个文件的访问路径:"C:\Program Files\Microsoft.NET\ADOMD.NET",你需要把它写成以下格式
string path = "C:\\Program Files\\Microsoft.NET\\ADOMD.NET";
这样取消字符串转义太麻烦了,C++11下可以这样写:
string path = R"(C:\Program Files\Microsoft.NET\ADOMD.NET)";
除了上面这样,你还可以使用引号
string path = R"(this "word" is good)";
二、委托构造函数(Delegating constructors)
说简单一点就是你的一个构造函数可以调用另一个构造函数
#include <bits/stdc++.h>
using namespace std;
multimap<int, int> r;
multimap<int, int>::iterator it;
class people
{
public:
string name;
int age;
int id;
people(int age,int id):age(age),id(id)
{
}
//委托构造函数不能具有其他成员初始化表达式
// people(int age,int id,string name):name(name),people(age,id)
// {
// }
people(int age,int id,string name):people(age,id)
{
}
}
三、初始化列表
用列表的形式来初始化数组,这种方式非常直观,但只能适用于数组,不能适用于我们自定义的容器:
int anArray[5] = { 3, 2, 7, 5, 8 }; // ok
std::vector<int> vArray = { 3, 2, 7, 5, 8 }; // 不支持
C++11现在支持了
#include <bits/stdc++.h>
using namespace std;
template<typename T>
class test{
private:
vector<T> arr;
public:
test(){}
test(const initializer_list<T>& li){
for(auto x : li){
arr.push_back(x);
}
}
};
class Value{
public:
int x,y;
double z;
Value(int a,int b,double c):x(a),y(b),z(c){
}
};
int main(){
test<int> t={1,2,3,4};
return 0;
}
四、统一初始化
C++对象初始化方法有很多种,C++ 11中,允许通过以花括号的形式来调用构造函数。这样多种对象构造方式便可以统一起来了
#include <bits/stdc++.h>
using namespace std;
multimap<int, int> r;
multimap<int, int>::iterator it;
class Value{
public:
int x,y;
double z;
//不加这个构造函数也不会报错,但是为了看起来清晰建议还是加上
Value(int a,int b,double c):x(a),y(b),z(c){
}
};
Value te(){
return {1,2,0.1};
}
int main(){
Value v = te();
printf("%d %d %lf\n",v.x,v.y,v.z);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
multimap<int, int> r;
multimap<int, int>::iterator it;
int main()
{
r.insert({1,2});
r.insert({1,3});
for(it=r.begin();it!=r.end();it++){
printf("%d %d\n",it->first,it->second);
//std:cout << it->first << " is " << it->second << std::endl;
}
return 0;
}