#include
#include
#include
#include
#include
//p31
std::function<int(int, int)> returnLambda (){
return [] (int x, int y){
return x*y;
};
}
//https://www.bilibili.com/video/BV1DV411k7X6?t=625
//Implement enumerate in c++17
template<typename T,
typename TIter = decltype(std::begin(std::declval())),
typename = decltype(std::end(std::declval()))>
constexpr auto enumerate(T && iterable){
struct iterator{
int i;
TIter iter;
bool operator != (const iterator & other) const {return iter != other.iter;}
void operator ++ () {++i; ++iter;}
auto operator * () const {return std::tie(i, *iter);}
};
struct iterable_wrapper{
T iterable;
auto begin() {return iterator{0, std::begin(iterable)}; }
auto end() {return iterator {0, std::end(iterable)}; }
};
return iterable_wrapper{std::forward<T>(iterable) };
}
struct A{
int val;
A(int val): val(val) {std::cout << “A(int)” << std::endl;}
A(const A& a): val(a.val) {std::cout << “A(A&)” << std::endl;}
A(A&& a): val(a.val) {std::cout << “A(A&&)” << std::endl;}
};
//p35
template
class MyClass{
private:
T value;
public:
template
void assign (const MyClass& x) {
value = x.getValue();
}
T getValue() const{
return value;
}
};
void f(){
MyClass d;
MyClass i;
d.assign(d);
d.assign(i);
}
int main(){
//p28
[]{
std::cout << “hello lambda” << std::endl;
}();
auto l = []{
std::cout << "hello world" << std::endl;
};
l();
auto k = [](const std::string& s){
std::cout << s << std::endl;
};
k("Great Wall");
int x = 0;
int y = 42;
auto qqq = [x, &y] {
std::cout << "x: " << x << std::endl;
std::cout << "y: " << y << std::endl;
++y;
};
x = y = 77;
qqq();
qqq();
std::cout << "final y: " << y << std::endl;
int id = 0;
auto f = [id] () mutable {
std::cout << "id: " << id << std::endl;
++id;
};
id = 42;
f();
f();
f();
std::cout << id << std::endl;
//p31
auto lf = returnLambda();
std::cout << lf(6, 7) << std::endl;
std::vector<int> arr{1, 2, 4, 8};
// for(size_t i = 0; i < arr.size(); ++i)
// std::cout << i << " " << arr[i] << std::endl;
// size_t idx = 0;//无下标, 多重循环麻烦的
// for(int v : arr)
// std::cout << idx++ << " " << v << std::endl;
// for(auto it = std::begin(arr); it != std::end(arr); ++it)
// std::cout << std::distance(std::begin(arr), it) << " " << *it << std::endl;
/*
for(int v : arr)
std::cout << v << std::endl;
for(auto it = arr.begin(); it != arr.end(); ++it){
int v = *it;
std::cout << v << std::endl;
}
*/
for(const auto& [i, v] : enumerate(arr))
std::cout << i << " " << v << std::endl;
std::list<std::string> lst{"hello", "world!"};
for(const auto& [i, v] : enumerate(lst))
std::cout << i << " " << v << std::endl;
for(const auto& [i, v] : enumerate(std::string("abcde")))
std::cout << i << " " << v << std::endl;
std::vector<A> vec;
vec.reserve(3);
vec.emplace_back(1);
vec.emplace_back(2);
vec.emplace_back(4);
for(const auto& [i, v] : enumerate(vec))
std::cout << i << " " << v.val << std::endl;
for(const auto& [i, v] : enumerate(std::vector<A>{A(1), A(2), A(4)}))
std::cout << i << " " << v.val << std::endl;
return 0;
}
/*
wannian07@wannian07-PC:~$ g++ -o c11 c11.cpp
wannian07@wannian07-PC:~$ ./c11
hello lambda
hello world
Great Wall
x: 0
y: 77
x: 0
y: 78
final y: 79
id: 0
id: 1
id: 2
42
42
//0 1
//1 2
//2 4
//3 8
//0 1
//1 2
//2 4
//3 8
//0 1
//1 2
//2 4
//3 8
//0 1
//1 2
//2 4
//3 8
0 hello
1 world!
0 a
1 b
2 c
3 d
4 e
A(int)
A(int)
A(int)
0 1
1 2
2 4
A(int)
A(int)
A(int)
A(A&)
A(A&)
A(A&)
0 1
1 2
2 4
*/