Как использовать лямбда-функцию для печати пары <>?

0

Я хочу напечатать пару, например

std::cout << make_pair(std::string,int) << endl;

Но он не компилируется, потому что operator<<(ostream &, std::pair<std::string,int>) не определен.

Но поскольку теперь мы имеем С++ 11 с лямбда-функциями, я могу использовать лямбда-функции с выражением for_each для работы с контейнерами.

В приведенном выше случае, как я могу предоставить "метод на месте", который может использоваться ostream для печати пары?

  • 0
    "который может быть использован ostream" Что вы имеете в виду, когда используете ostream ? Вы хотите объявить функцию ostream& operator<<(ostream&, pair<string,int> const&); ?
  • 0
    да, я хочу определить функцию, но «на месте» не явно
Показать ещё 1 комментарий
Теги:
c++11
lambda

2 ответа

1

Пары (и другие кортежи) на самом деле не похожи на контейнеры, потому что их элементы имеют гетерогенные типы. Их нельзя повторять обычным способом. Так что лямбда здесь не применима.

Если вы хотите, просто определите output_pair шаблона output_pair которая принимает ostream и пару и выводит два элемента пары. Или, если вы хотите сохранить стиль извлечения, вы можете иметь output_pair return output_pair_struct который ничего не делает, кроме как удерживать копию кортежа, и определить оператор << на output_pair_struct который сделал фактическую работу, чтобы вы могли иметь std::cout << output_pair(mypair) << endl; ,

  • 0
    я сказал лямбда, потому что он может быть создан на месте. Точно так же я хотел создать pair printing function где я создаю пару. и использовать его немедленно в cout
  • 0
    Нет смысла создавать лямбду, если вы намереваетесь вызвать ее только один раз, и тут же. std::cout << pair.first << pair.second ... какие недостатки имеет эта строка кода, которую вы пытаетесь устранить?
Показать ещё 2 комментария
0

В приведенном выше случае, как я могу предоставить "метод на месте", который может использоваться ostream для печати пары?

auto print = [&](const std::pair<std::string,int>& p) {
    std::cout << p.first << ", " << p.second << "\n";
};

std::map<std::string,int> sequence = { /* ... */ };
for_each(sequence.begin(), sequence.end(), print);
for(const auto& p: sequence)
    print(p);

или:

for_each(sequence.begin(), sequence.end(),
    [&](const std::pair<std::string,int>& p) {
        std::cout << p.first << ", " << p.second << "\n";
});

В любом случае, это слишком сложно. Вы должны написать так:

for(const auto& p: sequence)
    std::cout << p.first << ", " << p.second << "\n";

Ещё вопросы

Сообщество Overcoder
Наверх
Меню