std::map 有没有办法像键的谓词一样“编辑”值?

Posted

技术标签:

【中文标题】std::map 有没有办法像键的谓词一样“编辑”值?【英文标题】:Is there a way for std::map to "edit" values like a predicate for the key? 【发布时间】:2010-12-25 01:35:43 【问题描述】:

我想知道是否可以为 std::map 的所有值创建一个谓词之类的东西,这样我就不必在将值插入地图之前对其进行编辑。

我想要的是这样的:

mymap["username"] = " Marlon "; // notice the space on both sides of my name
assert(mymap["username"] == "Marlon"); // no more whitespace

上下文是我正在为 .ini 文件创建一个 std::map 并且我希望它在我想要检索它们时自动从值中删除前导/尾随空格。我已经创建了一个谓词来忽略键中的大小写和空格,所以我想知道是否可以对值执行相同的操作。

【问题讨论】:

在插入或检索值时修剪它们? ***.com/questions/122616/… 不要粗鲁,但为了我要问的问题,请阅读我用粗体写的内容。 你为什么要这个?在插入之前修改它们有那么糟糕吗? 了解在 C++ 中是否可行。了解一种语言的能力不是很好吗? :D C++ 可以做很多事情。这并不是一个好主意。 (至于确定一种语言的能力,我想说知道它是图灵完备的就足够了...... :-)) 【参考方案1】:

我认为您必须遵循重载原则才能达到预期的目标, 试试这个选项,

//map<string,string> testMap; Old Map definition
tMap testMap;

在哪里,

class tMap

        public:

                map<mystring,string> _tMap;

                mystring& operator [] (const char *index)
                
                        return _tMap[index];
                

;

mystring 又是一个可以为 '==' 运算符重载以进行修剪的类。 我知道地图可以实现为一个类(包装器),然后用于实现所需的结果。可能需要更多的努力才能解决这个问题。

【讨论】:

【参考方案2】:

你可以有一个包装器类来包装std::string

    可从 std::string 隐式构造 实现来自std::string 的转换运算符。

您可以在这些函数中的任何一个中动态编辑值。您std::map 可以将包装器作为密钥。

话虽如此,还是更明确一点,而不是聪明一点,并拥有一个具有自己的 get/set 接口的单独 INI 类。

【讨论】:

以上是关于std::map 有没有办法像键的谓词一样“编辑”值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C 类型 uuid_t 作为 std::map 中的键的最佳方法是啥?

在普通键的情况下使用map over unordered_map有什么好处吗?

带有键的 std::map 作为具有三个 int 成员的结构 [重复]

从满足谓词的无序映射中删除元素

如何确保订购std :: map?

迭代 unordered_map 时如何获取指向键的指针?