STL Algo Library copy()
STL Algo Library copy()
只是一个关于复制如何工作的问题。。。出于精神健全的目的,我需要一些验证。如果我有:
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++中做类似的事情,但它有点混乱。
- Boost Graph Library,修复节点大小
- std::filesystem::copy throws filesystem_error
- SFML library: http request
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 解决"ld: library not found for -ltensorflow_framework.2.3.0"
- Linking library C++
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- C++ class vs a library
- QML/C++/QObject Struct Copy
- C++ library with Tensorflow on Android
- CMake:尝试在 Jenkins 构建机器上运行时出现"Linked Library"错误 (0xc0000135)
- C++赋值运算符,我们可以用 copy 替换它吗?
- 为什么我使用 std::copy() 收到运行时错误(分段错误)?
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- 如何使用 std::copy 当类有"无符号字符和运算符[]"时
- std::copy 导致运行时检查失败 #2
- 为什么 Clang 在命名空间'std'中没有名为 'copy' 的成员给出错误
- STL Algo Library copy()