目标是将所有值从复制std::map到std::vector。
是的,不用它,std::copy你可以简单地循环遍历字典的所有值,然后把它们扔到一个向量中。但是,它是在std::copy.
最小的例子:
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
int main()
{
std::map<int, std::string> m;
m[0] = "Hello";
m[7] = "Heey";
m[-59] = "R";
m[1024] = "Rrrrrrrrroooooooooocccccccckkkkkk";
std::vector<std::string> res;
// Хочется, чтобы строка работала как-то так, но проблема в том, что элементы словаря – пары, а не только значения
// std::copy(m.begin(), m.end(), res.begin());
// Здесь планирую получить вывод в виде всех значений словаря m
for (std::vector<std::string>::const_iterator elem = res.begin(); elem != res.end(); ++elem)
std::cout << *elem << std::endl;
return 0;
}
所以从我的角度来看,问题归结为:如何在不考虑键的情况下获取字典值序列的迭代器?也就是说,要取消引用迭代器,请获取 not std::pair,但std::string在我的情况下。
PS 我用的是C++07,也就是出现在C++11中的功能对我来说是不可用的(请不要问为什么,对我来说没有必要也没有必要。)
在 C++ 中,仍然没有开箱即用的字典值迭代器(我还没有查看 C++20 中是否会修复某些内容)。悲伤但真实。但是它自己的包装非常简单。在基本情况下,它看起来像这样:
second_unwraper()只需要避免在构造函数中指定模板参数。从 C++17 开始,模板中的类型推断得到了改进,可以省去:不幸的是
std::copy,它不适合这个目的。我建议使用算法std::for_each或std::transform. 对于旧标准,您必须编写一个仿函数,但对于 C ++ 11 及更高版本,一个 lambda 就足够了:for_each 的解决方案示例:
带有转换的示例解决方案: