CPlusPlusThings/c++2.0/auto.cpp
Light-City 4f8b242a10 update
2019-11-05 17:27:32 +08:00

106 lines
2.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by light on 19-11-2.
//
#include <iostream>
#include <list>
#include <algorithm>
#include <vector>
#include <functional>
#include <iterator>
using namespace std;
// iterator stl_iterator.h里面的源码 使用auto
template<typename _Iterator>
#if __cplusplus < 201103L
inline typename reverse_iterator<_Iterator>::difference_type
operator-(const reverse_iterator<_Iterator>& __x,
const reverse_iterator<_Iterator>& __y)
#else
inline auto
operator-(const reverse_iterator<_Iterator> &__x,
const reverse_iterator<_Iterator> &__y)
-> decltype(__x.base() - __y.base())
#endif
{ return __y.base() - __x.base(); }
// auto 关键字(c++11) 语法糖
// for 循环 ranged-base for
class C {
public:
explicit C(const string &s) : mystr(s) {
}
friend ostream &operator<<(ostream out, const C &c) {
out << c.mystr << endl;
}
private:
string mystr;
};
int main() {
auto i = 42; // 编译器具备实参推导
auto ll1 = [](int x) -> int {
return x + 10;
};
// lambda 匿名函数
function<int(int x)> ll = [](int x) -> int {
return x + 10;
};
cout << ll(10) << endl;
list<int> l{1, 2, 3};
list<int>::iterator iterator;
iterator = find(l.begin(), l.end(), 10);
auto ite = find(l.begin(), l.end(), 11); // auto 关键字
vector<int> vec;
//=====================range-based for statement=========================
// (1)
for (auto elem:vec) // pass by value
cout << elem << endl;
// c++2.0 之前 (2) 编译器会把(1)转换为(2)或(3)
for (auto _pos = l.begin(), _end = l.end(); _pos != _end; ++_pos)
cout << *_pos << " ";
cout << endl;
// (3)
// c++2.0之后 全局函数begin(container)与end(container) 可以接受容器
for (auto _pos = begin(l), _end = end(l); _pos != _end; ++_pos)
cout << *_pos << " ";
cout << endl;
// (4)
for (auto &elem:vec) // pass by reference
elem *= 3;
// (5) 编译器会把(4)转换为(5)
for (auto _pos = l.begin(), _end = l.end(); _pos != _end; ++_pos) {
auto &elem = *_pos;
elem *= 3;
}
cout << endl;
vector<string> vs = {"hello", "world"};
// 加了explicit就不能转了 error
// for (const C &elem:vs) {
// }
// auto 不利降低代码可读性、可能得不到你预想的类型、配合decltype有意想不到的结果
// auto可能得不到你预想的类型如vector<bool>[]的返回类型。
vector<bool> v(true);
auto var = v.at(0);
cout<< typeid(var).name()<<endl;
return 0;
}