如何在多映射中更改字符串

How to change string in multimap

本文关键字:字符串 映射      更新时间:2023-10-16

我有多映射:

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中,如果比较函数对象是透明的,则可能需要放弃对fromto的显式转换。

我不太确定我是否正确地使用了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);

给定:

"我有一个多重映射",

"我需要更改密钥,而不是数据"

答案是:

"您选择了错误的数据结构-是时候重新思考解决方案了"