【问题标题】:STL Algo Library copy()STL 算法库 copy()
【发布时间】:2012-01-29 14:46:31
【问题描述】:

只是一个关于副本如何工作的问题......我需要一些验证以确保精神健全。如果我有:

multiset<pair<double, string> > myMultiset;

我正在尝试将内容打印到控制台...我应该在使用时出现错误:

copy(myMultiset.begin(), myMultiset.end(), ostream_iterator</.../>(cout, " "));

这是因为对于 A. 对于 ostream_iterator 我想传递 ostream 不喜欢的类型“pair”?如果多重集是由“对”组成的,即使我只是将类型字符串传递给“ostream”,我觉得尝试一次传递两个元素会导致错误。是否有一个迭代器可以仅迭代键或仅迭代值?有没有一种干净的方法来处理这个?每次我最终只写“for()”循环,这样我就可以使用“iter->first”和“iter->second”获取内容......我是 STL Algo 的新手,但我喜欢这个想法清洁度,我想利用他们的能力......虽然有很多细节......

【问题讨论】:

  • 你“感觉”?你为什么不实际尝试一下?
  • 我实际上已经尝试过它的一种变体,并弄清楚了它的发展方向。认为我试图做太多太快......

标签: c++ algorithm stl


【解决方案1】:

您的std::copy() 无法正常工作的原因是没有为std::pair 定义std::operator&lt;&lt;()。用户可以通过多种合理的方式对一对进行文本格式化,而标准未对其进行定义。您可以自己定义一个:

template<typename K, typename V>
std::ostream& operator<<(std::ostream& out, std::pair<K,V> const& p)
{
    return out << p.first;
}

// ...
std::copy(set.begin(), set.end(),
          std::ostream_iterator<double>(std::cout, " "));

或定义一个函数并改用std::transform()

std::transform(set.begin(), set.end(),
               std::ostream_iterator<double>(std::cout, " "),
               [](std::pair<double,std::string> const& p) {
    return p.first;
});

您可能会发现提取密钥的 lambda 很有用,并从中提取出一个实用函子以供重用:

struct keys_of {
    template<typename K, typename V>
    K operator()(std::pair<K,V> const& p) const
    {
        return p.first;
    }
};

// ...
std::transform(set.begin(), set.end(),
               std::ostream_iterator<double>(std::cout, " "),
               keys_of());

有时for 循环确实使事情变得更简单、更简洁、更容易理解。新的基于范围的for 循环更进一步:

for( auto p : set ) {
    std::cout << p.first << ' ';
}

这将与其他方法略有不同,因为它会在末尾留下一个悬空的空格分隔符。它也只适用于容器;如果您有一对迭代器而不是一个容器(例如,一对std::istream_iterator 或一对任意迭代器进入一个容器),那么您应该使用一种算法。但我认为它是最简单、最清晰的。

【讨论】:

    【解决方案2】:

    您使用的是 C++11 吗?如果是这样,您可以使用带有 lambda 的transform 算法来提取键(或值)。

    你可以在旧的 C++ 中做类似的事情,但它有点混乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多