Tôi đang cố gắng thu thập tất cả dữ liệu từ bản đồ bản đồ mà không cần phải thực hiện trong C++ Có 7 vòng.
Dữ liệu như sau:
Bản đồ 1=>Bản đồ 1.1=>Bản đồ 1.1.1=>Bản đồ 1.1.2=>Bản đồ 1.1.3=>Bản đồ 1.1.4=>Vector 1.1.5=>Thành phần 1
=> Phần 2
Bản đồ 1.2=>Bản đồ 1.2.1=>Bản đồ 1.2.2=>Bản đồ 1.2.3=>Bản đồ 1.2.4=>Vector 1.2.5=> Thành phần 1
=> Phần 2
Bản đồ 2 =>Bản đồ 1.1=>Bản đồ 1.1.1=>Bản đồ 1.1.2=>Bản đồ 1.1.3=>Bản đồ 1.1.4=>Vector 1.1.5=>Thành phần 1
=> Phần 2
Bản đồ 1.2=>Bản đồ 1.2.1=>Bản đồ 1.2.2=>Bản đồ 1.2.3=>Bản đồ 1.2.4=>Vector 1.2.5=>Thành phần 1
=> Phần 2
Vì vậy, tôi đang cố gắng thu thập tất cả phần tử 1 và phần tử 2 trong tất cả các bản đồ vào một bản đồ.
Ai đó có thể giúp tôi làm điều này mà không lặp lại rõ ràng qua từng bản đồ và dẫn đến 7 vòng lặp trong C++ không?
Cảm ơn sự giúp đỡ của bạn.
(Cập nhật: Ồ, nhìn lại 10 năm sau, thật là một cơn ác mộng mã hóa khi cố sửa mã kế thừa của người khác. Hy vọng bây giờ điều này sẽ không cần thiết :)
Tôi thích ý tưởng của @inflagranti - vì vậy, không yêu cầu tiện ích, đây là mẫu dành cho từng loại lặp lại mọi thứ. nó sử dụng is_container
từ máy in đẹp Các tính năng mà tôi sẽ không sao chép ở đây.
gia hạn: Bây giờ hoàn toàn có khả năng xử lý các loại giá trị trần và cặp.
更新 2: Lớp triển khai được đơn giản hóa nhờ @Luc Danton.
#include
#include "prettyprint.hpp"
sử dụng không gian tên beautiful_print; // cho đặc điểm "is_container"
mẫu struct is_pair : public std::false_type { };
mẫu struct is_pair<>> : public std::true_type { };
mẫu struct Final_value { typedef T };
mẫu struct Final_value<>> { typedef T type };
mẫu void for_each_recursive(Iter bắt đầu, Iter kết thúc, F f);
mẫu struct for_each_rec_impl;
mẫu
cấu trúc for_each_rec_impl
{
mẫu
tên kiểu tĩnh std::enable_if<>::value_type>::value, void>::type
go(Iter bắt đầu, Iter kết thúc, F f)
{
for (Iter it = started; it != end; ++it) f(it->second);
}
mẫu
tên kiểu tĩnh std::enable_if::value_type>::value, void>::type
go(Iter bắt đầu, Iter kết thúc, F f)
{
for (Iter it = started; it != end; ++it) f(*it);
}
};
mẫu
cấu trúc for_each_rec_impl
{
mẫu
tên kiểu tĩnh std::enable_if<>::value_type>::value, void>::type
go(Iter bắt đầu, Iter kết thúc, F f)
{
for (Iter it = bắt đầu; nó != kết thúc; ++it)
{
for_each_recursive(it->second.begin(), it->second.end(), f);
}
}
mẫu
tên kiểu tĩnh std::enable_if::value_type>::value, void>::type
go(Iter bắt đầu, Iter kết thúc, F f)
{
for (Iter it = bắt đầu; nó != kết thúc; ++it)
{
for_each_recursive(it->begin(), it->end(), f);
}
}
};
mẫu
void for_each_recursive(Iter bắt đầu, Iter kết thúc, F f)
{
tên kiểu typedef std::iterator_traits::value_type value_type;
typedef tên kiểu Final_value::type type;
for_each_rec_impl::value>::go(bắt đầu, kết thúc, f);
}
cách sử dụng:for_each_recursive(v.begin(), v.end(), my_predicate);
Tôi là một lập trình viên xuất sắc, rất giỏi!