std::map通过转换替换现有元素
std::map replace existing elements by transform
我有一个代码:
std::vector<int> vector = {1, 3, 5, 7, 9};
using my_type = std::pair<int, int>;
std::map<int, boost::optional<my_type>> map;
for (const auto &i : vector) {
map[i] = boost::none;
}
const my_type val = {1, 5};
std::transform(vector.cbegin(),
vector.cend(),
std::inserter(map, map.end()),
[&val](const int &i) {
return std::make_pair(i, boost::optional<my_type>(val));
});
一切都很好,但std::transform
不会通过用现有密钥替换值来更改映射,所以我有这个:
{
{1, boost::none},
{3, boost::none},
{5, boost::none},
{7, boost::none},
{9, boost::none},
}
是否有可能使其按以下简单范围工作?
for (const auto &i : vector) {
map[i] = boost::optional<my_type>(val));
}
附言:我知道std::inserter
和std::map::insert
是如何工作的,只是想知道如何更改变换以更改值。
不使用inserter
,因为insert
仅在map
中没有元素的情况下插入元素。在C++17中会有insert_or_assign。
template<typename Map>
struct map_insert_iterator : public std::iterator<std::output_iterator_tag, void, void, void, void>
{
public:
map_insert_iterator(Map& m) : map(m)
{
}
map_insert_iterator<Map>& operator = (const typename Map::value_type& value)
{
map.insert_or_assign(value.first, value.second);
return *this;
}
map_insert_iterator<Map>& operator * () { return *this; }
map_insert_iterator<Map>& operator ++ () { return *this; }
map_insert_iterator<Map>& operator ++ (int) { return *this; }
private:
Map& map;
};
template<typename Map>
map_insert_iterator<Map> map_inserter(Map& m)
{
return map_insert_iterator<Map>(m);
}
实时
相关文章:
- 按平均值替换数组中的元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- std::map:当元素不可默认构造时创建/替换元素
- 如何替换双端对象中的元素?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 如何根据向量中的值替换元素?
- 无法弄清楚为什么我的打印阵列要替换元素
- 将 Directx12 资产移植到 XAML 元素:关于 WRL 的建议::ComPtr 替换?
- 匹配部分专用化以按类型替换元组元素
- 删除两个相邻的元素并用矢量中的单个元素替换它们
- C :在我们拥有迭代器的std :: unordered_set中替换一个元素
- 在无序地图中替换元素
- 将矢量中的一系列元素替换为值
- 如何将向量中的所有元素替换为元素数字的总和
- 如何有效地用不同的整数元素替换字符字符串的元素
- 用下一个最大的元素替换每个元素?
- C++:将类数组的元素替换为 const 成员
- 外壳排序将数组的元素替换为 -858993460
- 将vector语言 - c++中的old_value元素替换为new_value
- 将元素替换为vector的特定位置