#include <iostream>
#include <vector>
#include <algorithm> //此头文件是算法库的一部分,for_each函数模板就定义于这个头文件
#include <boost/type_index.hpp> //boost::typeindex::type_id_with_cvr<decltype(variable)>().pretty_name()
using std::cout;
using std::endl;
using std::vector;
/*方法1:*/
/**
* @brief iterator实现遍历二维vector
* @param vec 二维vector
* @return void
*/
template <class T>
void traversal_two_dimensional_vector(vector<vector<T>> vec)
{
for (typename vector<vector<T>>::iterator iter = vec.begin(); iter != vec.end(); iter++) // typename用于消除歧义,显示告诉编译器vector<vector<T>>::iterator是类型名,而不是某类的成员
{
vector<T> vec_temp = *iter;
for (typename vector<T>::iterator it = vec_temp.begin(); it != vec_temp.end(); it++)
{
cout << *it << "\t";
}
cout << endl;
}
}
/*方法2:*/
/**
* @brief 范围for实现二维vector遍历
* @param vec 二维vector
* @return void
*/
template <class T>
void tarversal_vector_use_rangefor(const vector<vector<T>> vec)
{
for (auto i : vec)
{
// cout << boost::typeindex::type_id_with_cvr<decltype(i)>().pretty_name() << endl; //输出变量i完整类型名
for (auto j : i)
{
cout << j << "\t";
}
cout << endl;
}
}
/*方法3:*/
/**
* @brief for循环遍历二维vector
* @param vec 二维vectot
* @return viod
*/
template <class T>
void tarversal_vector_use_for(const vector<vector<T>> vec)
{
if (!vec.empty())
{
for (unsigned i = 0; i < vec.size(); i++)
{
vector<T> vec_temp = vec[i];
for (unsigned j = 0; j < vec_temp.size(); j++)
{
cout << vec_temp[j] << "\t";
}
cout << endl;
}
}
}
/*方法4:*/
/**
* @brief 使用for_each与Lambda表达式遍历二维vector
* @param vec 二维vector
* @return void
*/
template <class T>
void tarversal_vector_use_foreach(const vector<vector<T>> &vec)
{
std::for_each(vec.begin(), vec.end(), [](vector<T> vec_temp) { // cout << boost::typeindex::type_id_with_cvr<decltype(vec_temp)>().pretty_name() << endl; //输出变量i完整类型名
std::for_each(vec_temp.begin(), vec_temp.end(), [](auto value)
{ cout << value << "\t"; });
cout << endl;
});
}
int main(int argc, char **argv)
{// 定义一个int类型的二维vector
vector<vector<int>> ivec{vector<int>{4, 3}, vector<int>{2, 1}};
// 定义一个string类型的二维vector
vector<vector<std::string>> str_vec{vector<std::string>{"zhangsan", "student"}, vector<std::string>{"wangwu", "teacher"}};
// 使用iterator遍历二维vector
// traversal_two_dimensional_vector(str_vec);
// traversal_two_dimensional_vector(ivec);
// 使用range for遍历二维vector
// tarversal_vector_use_rangefor(str_vec);
// tarversal_vector_use_rangefor(ivec);
// 使用for循环遍历二维vector
// tarversal_vector_use_for(str_vec);
// tarversal_vector_use_for(ivec);
// 使用for_each与lambda遍历二维 vector
// tarversal_vector_use_foreach(str_vec);
// tarversal_vector_use_foreach(ivec);
}