转换 map<int C++,请将<int>>设置为 map<int, 矢量<int>>
C++ converting map<int, set<int> > into map<int, vector<int>>
我必须转换一个std::map,如下所示:
std::map<int, std::set<int> > t_contents;
在这样的地图上:
std::map<int, std::vector<int> > seq;
我用这种方式进行转换:
std::map<int, std::set<int> >::const_iterator it;
for(it = t_contents.begin(); it != t_contents.end(); ++it)
{
std::move((*it).second.begin(), (*it).second.end(),
std::back_inserter(seq[(*it).first])
);
}
考虑到地图包含多达100万个元素,每个集合也可以包含多达1万个元素。这是我在浪费空间和时间方面找到的最佳解决方案;有更好的方法做这项工作吗?
如果使用提示插入:,性能会更好(每次插入的摊销常数)
std::map<int, std::set<int> >::const_iterator it;
for (it = t_contents.begin(); it != t_contents.end(); ++it) {
std::vector<int> &vec = seq.insert(seq.end(),
std::make_pair(it->first, std::vector<int>()))->second;
vec.reserve(it->second.size());
vec.assign(it->second.begin(), it->second.end());
}
使用reserve
来防止重新分配,并将vector::assign
与迭代器参数一起使用;它比CCD_ 3更可读(如果不是更有效的话)。
另一种选择是将矢量直接放置到地图中,仍然使用提示:
std::map<int, std::set<int> >::const_iterator it;
for (it = t_contents.begin(); it != t_contents.end(); ++it) {
seq.emplace_hint(seq.end(), it->first,
std::vector<int>(it->second.begin(), it->second.end());
}
注意,不需要move
集合元素;因为它们是基本体,所以移动和复制是一样的。
这可能更快或更慢,例如取决于insert
是否检查迭代器参数之间的距离(在任何情况下,它都是集合大小上的O(n))。
另一个选项是:
std::transform(t_contents.begin(), t_contents.end(), std::inserter(seq.begin()),
[](const std::pair<const int, std::set<int>>& s) {
std::vector<int> v;
v.reserve(s.second.size());
v.assign(s.second.begin(), s.second.end());
return std::make_pair(s.first, std::move(v));
}
);
移动int
是毫无意义的,而且std::set
迭代器无论如何都是常量,所以不能移出集合。
与ecatmur的答案一样,这得益于使用提示进行插入,因为每次对insert_iterator
的赋值都会以前一个插入点作为提示执行insert
,这是一个巨大的性能优势,因为输入范围已经按照相同的顺序排序,因此每次连续插入都与最后一个相邻。
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- EASTL矢量<向量<int>>连续的
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- 'structstd::对<int,int>'没有名为'push_back'