У меня есть код, который возвращает название города и население, только если население превышает 5 миллионов.
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
template <typename C>
static auto opt_print(const C& container) {
return [end_it (end(container))] (const auto& item) {
if (item != end_it) {
cout << *item << endl;
}
else {
cout << "<end>" << endl;
}
};
}
struct city {
string name;
unsigned population;
};
bool operator==(const city& a, const city& b) {
return (a.name == b.name && a.population == b.population);
}
ostream& operator<<(ostream& os, const city& c) {
return os << "{" << c.name << ", " << c.population << "}";
}
int main() {
const vector<city> c {
{"NYC", 8398748},
{"LA", 3990456},
{"Chicago", 2705994},
{"Houston", 2325502}
};
auto print_city (
opt_print(c)
);
auto population_more_than (
[] (unsigned i) {
return [=] (const city& item) {
return (item.population > i);
};
}
);
auto found_large(
find_if(
begin(c),
end(c),
population_more_than(5000000)
)
);
print_city(found_large);
return 0;
}
У меня есть следующие вопросы:
-
Чего я не понимаю, так это лямбда-функции population_more_than
: зачем мне два слоя лямбда-функций? Есть ли способ упростить код?
Что здесь делает [=]
? По определению лямбда-функции [=]
означает принятие всех внешних переменных по значению, что принимает [=]
? Отнимает ли он только часть unsigned i
от внешнего слоя?
Если я хочу изменить лямбда-функцию population_more_than
на следующую:
auto population_more_than (
[&each_city] (unsigned i) {
return (each_city.population > i);
}
);
Как мне изменить auto found_large
Лямбда-функция часть соответственно? Он уже основан на итераторе, но я не могу запустить код ...