#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>
#include <string>
#include <map>


int LambdaContainer()
{
	auto fc = [](const std::string& a, const std::string& b) {
		return a.length() > b.length();
	};
	std::map<std::string, int, decltype(fc)> myMap = { {"apple", 5}, {"banana0", 10}, {"orange", 15} };

	// 使用迭代器遍历map
	std::cout << "使用迭代器遍历map：" << std::endl;
	for (auto it = myMap.begin(); it != myMap.end(); ++it) {
		std::cout << it->first << " : " << it->second << std::endl;
	}

	// 需要C++20支持
	std::map < std::string, int, decltype([](const std::string& a, const std::string& b) {
		return a.length() < b.length();
	}) > myMap2 = { {"apple", 5}, {"banana0", 10}, {"orange", 15} };
	// 使用范围for循环遍历map
	std::cout << "\n\n使用范围for循环遍历map：" << std::endl;
	for (const auto& [key, value] : myMap2) {
	    std::cout << key << " : " << value << std::endl;
	}

	return 0;
}

int LambdaThread()
{
	// vector 容器存储线程
	std::vector<std::thread> workers;
	for (int i = 0; i < 5; i++)
	{
		workers.push_back(std::thread([]()
			{
				std::cout << "thread function\n";
			}));
	}
	std::cout << "main thread\n";

	// 通过 for_each 循环每一个线程
	// 第三个参数赋值一个task任务
	// 符号'[]'会告诉编译器我们正在用一个匿名函数
	// lambda函数将它的参数作为线程的引用t
	// 然后一个一个的join
	std::for_each(workers.begin(), workers.end(), [](std::thread& t)
		{
			t.join();
		});

	return 0;
}

