通过std ::变换使std ::映射到集合
flattening a std::map to a set via std::transform
我需要将一个从 std::map<int, std::set<std::string>>
到 std::set<std::string>
的容器将一个容器弄平,并且我正在使用语法遇到困难。当我说弄平时,我基本上想用缝合在一起的所有集合来制作一个std::set<string>
- (set
将防止重复的条目,这是我所需要的),我正在根据此问题是我的价值类型是一个容器,使问题更难解决。编译器的输出很难理解,这里的来源如下所示。
我有一个我的代码的实时coliru 在这里
int main()
{
std::set<std::string> outputSet;
std::map<int, std::set<std::string>> inputMap = {
{1, {"a", "b", "c"}},
{2, {"b", "c", "d"}}
};
std::transform(inputMap.cbegin(), inputMap.cend(),
std::inserter(outputSet, outputSet.end()),
[](const std::map<int, std::set<std::string>>::value_type& rNext) {
return rNext.second;
});
}
错误如下:
In file included from /usr/local/include/c++/6.2.0/algorithm:62:0,
from main.cpp:4:
/usr/local/include/c++/6.2.0/bits/stl_algo.h: In instantiation of '_OIter std::transform(_IIter, _IIter, _OIter, _UnaryOperation) [with _IIter = std::_Rb_tree_const_iterator<std::pair<const int, std::set<std::__cxx11::basic_string<char> > > >; _OIter = std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >; _UnaryOperation = main()::<lambda(const value_type&)>]':
main.cpp:19:10: required from here
/usr/local/include/c++/6.2.0/bits/stl_algo.h:4177:12: error: no match for 'operator=' (operand types are 'std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >' and 'std::set<std::__cxx11::basic_string<char> >')
*__result = __unary_op(*__first);
~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/local/include/c++/6.2.0/bits/stl_algobase.h:67:0,
from /usr/local/include/c++/6.2.0/bits/stl_tree.h:63,
from /usr/local/include/c++/6.2.0/set:60,
from main.cpp:1:
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:680:7: note: candidate: std::insert_iterator<_Container>& std::insert_iterator<_Container>::operator=(const typename _Container::value_type&) [with _Container = std::set<std::__cxx11::basic_string<char> >; typename _Container::value_type = std::__cxx11::basic_string<char>]
operator=(const typename _Container::value_type& __value)
^~~~~~~~
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:680:7: note: no known conversion for argument 1 from 'std::set<std::__cxx11::basic_string<char> >' to 'const value_type& {aka const std::__cxx11::basic_string<char>&}'
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:688:7: note: candidate: std::insert_iterator<_Container>& std::insert_iterator<_Container>::operator=(typename _Container::value_type&&) [with _Container = std::set<std::__cxx11::basic_string<char> >; typename _Container::value_type = std::__cxx11::basic_string<char>]
operator=(typename _Container::value_type&& __value)
^~~~~~~~
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:688:7: note: no known conversion for argument 1 from 'std::set<std::__cxx11::basic_string<char> >' to 'std::set<std::__cxx11::basic_string<char> >::value_type&& {aka std::__cxx11::basic_string<char>&&}'
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:629:11: note: candidate: constexpr std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >& std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >::operator=(const std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >&)
class insert_iterator
^~~~~~~~~~~~~~~
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:629:11: note: no known conversion for argument 1 from 'std::set<std::__cxx11::basic_string<char> >' to 'const std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >&'
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:629:11: note: candidate: constexpr std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >& std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >::operator=(std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >&&)
/usr/local/include/c++/6.2.0/bits/stl_iterator.h:629:11: note: no known conversion for argument 1 from 'std::set<std::__cxx11::basic_string<char> >' to 'std::insert_iterator<std::set<std::__cxx11::basic_string<char> > >&&'
您使用std::inserter
创建的std::insert_iterator
期望分配一个元素,然后将其插入容器中,但是您正在尝试将整个set
分配给它。p> std::for_each
更适合您要做的事情
std::for_each(inputMap.cbegin(), inputMap.cend(),
[&](auto const& m) {
outputSet.insert(m.second.begin(), m.second.end());
});
只需使用范围for
的直接方式做事:
for (const auto& v : inputMap)
for (const auto& e : v.second)
outputSet.insert(e);
可能不是超级优雅的;但是它也不会生成任何编译器错误。通过这种工作,您可以根据需要进行调整/需要对其他事情进行调整。例如
for (const auto& v : inputMap)
outputSet.insert(v.second.cbegin(), v.second.cend());
相关文章:
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 将唯一指针插入std::映射
- 重载std::映射不同的密钥类型
- std::映射,只有move构造函数可用
- std::映射服装比较函数和函数/lambda错误
- std::映射导致插入时出现C2664错误
- 将从std::映射中获取的std::pair引用传递给接受std::对引用的函数
- std::映射键作为模板化结构与枚举成员
- std ::映射以构造为钥匙
- 在锁定下清除STD ::映射,而移动到临时对象
- 计算向量的std ::映射为键的值,并将双倍作为值
- 写入/读取 std::映射到二进制文件需要运算符
- 我如何正确地为std ::映射分配内存
- 如何打印包含整数和整数集的std::映射
- 在字符串的std::映射中找到编译错误,long
- 将std ::映射复制到std ::对向量
- 使用std ::映射的键的部分匹配
- 遍历std ::映射,效果少于迭代器之间的比较