STL Algo Library copy()

STL Algo Library copy()

本文关键字:copy Library Algo STL      更新时间:2023-10-16

只是一个关于复制如何工作的问题。。。出于精神健全的目的,我需要一些验证。如果我有:

multiset<pair<double, string> > myMultiset;

我正在设法将内容打印到控制台。。。我应该预计在使用时会出现错误:

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

这是因为对于A.,对于ostream_iterator,我正在尝试传递ostream不喜欢的类型"pair"?如果multiset是由"pair"组成的,即使我只会将类型字符串传递到"ostream",但我觉得试图同时传递两个元素会导致错误。有没有一个迭代器可以只对键或值进行迭代?有干净的方法处理这个吗?每次我只写"for()"循环,这样我就可以用"iter->first"answers"iter->second"来获取内容。。。我是STL Algo的新手,但我喜欢清洁的想法,我想利用他们的功能。。。尽管有这么多分钟。。。

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

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或一对容器中的任意迭代器),那么你应该使用一个算法。但我认为这是最简单、最清晰的。

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

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