如何在多映射中更改字符串
How to change string in multimap
我有多映射:
multimap<string, vector<object> > myMultimap;
并且我需要更改已经创建的多映射的一部分中的字符串。
it->first=newString;
不起作用。。。。
如果您需要用该键"更改"所有元素的键:
template<typename Key, typename ValueType, typename Compare,
typename Allocator, typename FromKey, typename ToKey>
auto change_key(std::multimap<Key, ValueType, Compare, Allocator>& m,
FromKey const& from_raw, ToKey const& to_raw)
-> typename std::multimap<Key, ValueType, Compare, Allocator>::iterator
{
Key const& from = from_raw; // convert once only, not in each iteration
Key const& to = to_raw;
auto hint = m.lower_bound(to);
auto const itsFrom = m.equal_range(from);
for(auto cur = itsFrom.first; cur != itsFrom.second; ++cur)
{
hint = m.emplace_hint(hint, to, std::move(cur->second));
}
m.erase(itsFrom.first, itsFrom.second);
return hint;
}
在C++1y中,如果比较函数对象是透明的,则可能需要放弃对from
和to
的显式转换。
我不太确定我是否正确地使用了lower_bound
作为提示;标准(n3797)对表102中的提示p
——关联容器要求(除容器外)进行了如下说明:
元素尽可能靠近
p
之前的位置插入。
以及复杂性:
一般是对数的,但如果元素正好插入
p
之前,则摊销常数
因此,我们需要插入点之后的位置;我不确定插入点本身是否是一个有用的提示。对我来说,这似乎建议使用upper_bound
,因为它总是返回一个关键字大于搜索关键字的位置;另一方面,我一直在寻找答案,这些答案表明使用lower_bound
是可行的。
用法示例:
#include <map>
#include <vector>
#include <iostream>
#include <string>
struct object
{
int m;
};
std::ostream& operator<<(std::ostream& o, object const& p)
{
return o << p.m;
}
template<typename V>
std::ostream& operator<<(std::ostream& o, std::vector<V> const& v)
{
for(auto const& e : v) o << e;
return o;
}
template<typename K, typename V>
std::ostream& operator<<(std::ostream& o, std::multimap<K, V> const& m)
{
for(auto const& p : m) o << "["<<p.first<<" : "<<p.second<<"], ";
return o;
}
int main()
{
auto make_vector = [](int p) { return std::vector<object>{{p}}; };
std::multimap<std::string, std::vector<object>> myMultimap =
{{
{"1st", make_vector(0)}
, {"1st", make_vector(1)}
, {"1st", make_vector(2)}
, {"2nd", make_vector(3)}
, {"2nd", make_vector(4)}
, {"2nd", make_vector(5)}
, {"3rd", make_vector(6)}
, {"3rd", make_vector(7)}
, {"3rd", make_vector(8)}
}};
std::cout << myMultimap;
change_key(myMultimap, "2nd", "4th");
std::cout << "nn" << myMultimap;
}
不能更改映射/多映射的键,因为它是一个常数值。另一种方法是找到您想要替换的密钥,删除它并插入新值:
typedef multimap<string, vector<object> > Multimap;
Multimap myMultimap;
// ...
Multimap::iterator item_pos = myMultimap.find("some value");
if(item_pos != myMultimap.end())
{
vector<object> key_value = item_pos->second;
myMultimap.erase(item_pos);
myMultimap.insert(Multimap::value_type("new value", key_value));
}
你不能只"更改"这样的键,你必须为记录创建一个新条目,并删除旧条目:
multimap<string, vector<object> > myMultimap;
...
myMultimap.insert(std::make_pair(newString, it->second));
myMultimap.erase(it);
给定:
"我有一个多重映射",
"我需要更改密钥,而不是数据"
答案是:
"您选择了错误的数据结构-是时候重新思考解决方案了"
相关文章:
- 如何使用Visual Studio 2008将字符串映射到函数?
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 在声明unordered_map的错误中,将字符串映射到模板
- 将字符串映射到矢量或将不同的键映射到一个值
- 使用 C++11 可变参数模板初始化枚举到字符串映射
- 将字符串映射到 C++ 中的类函数
- 根据该输入字符串将字符串映射到不同的类
- 如何访问 <int,字符串>映射中的特定字符?
- C字符串映射键
- C 索引中的字符串映射而无需分配
- 实现将字符串映射到 C++ 中的数组的哈希表。我一直在"Debug Assertion Failed",我不知道为什么
- 将字符串映射到无符号 int 到无符号 int 的映射
- C++ std::将字符串映射到指针
- c++将大型数字字符串映射到数字字符串范围
- 使用字符串映射的向量时可能会发生内存泄漏C++
- 一个比较2个字符串映射的通用C++规则引擎
- 如何在c++中仅针对键的子集有效地比较两个字符串映射
- 如何将用户输入(字符串)映射到Enum值
- 我如何消除这个枚举到字符串映射代码的样板文件?