所以我编写了这段代码,它不会编译。我认为原因在于,当给定这样的迭代器范围时,std::transform将对迭代器所指向的类型进行操作,而不是迭代器本身。是否有任何简单的包装器、标准库工具等来使此代码工作--即将原始映射的所有迭代器存储到一个新的向量中,并且所需的更改最少?谢谢!
#include <map>
#include <iostream>
#include <vector>
using MT = std::multimap<char, int>;
using MTI = MT::iterator;
int main()
{
MT m;
m.emplace('a', 1); m.emplace('a', 2); m.emplace('a', 3);
m.emplace('b', 101);
std::vector<MTI> itrs;
std::transform(m.begin(), m.end(), std::back_inserter(itrs), [](MTI itr){
return itr;
});
}编辑1:用gcc11和clang13编译失败,C++17/20
编辑2:这个问题的目的主要是出于好奇。我想看看有什么好的方法来操作现有的标准算法,使其在我想要的水平上工作。示例代码和问题完全由演示组成,但它们与任何需要解决的实际问题无关。
发布于 2022-01-27 10:07:03
传递给std::transform的函数和一般的算法应该使用元素,而不是迭代器。您可以使用键在映射中找到迭代器,尽管这既不高效也不简单。相反,使用普通循环:
for (auto it = m.begin(); it != m.end(); ++it) itrs.push_back(it);https://stackoverflow.com/questions/70876567
复制相似问题