C 样式字符串键上的多重映射无法插入条目
multimap on C-style string key fails to insert entries
我正在尝试创建一个在 C 样式字符串上索引的多重映射,如以下代码段所示:
#include <cstring>
#include <map>
#include <iostream>
using namespace std;
int main(void)
{
int i, j;
int (*fn_pt)(const char *, const char *) = strcmp;
multimap<char *, char *, int (*)(const char *, const char *)>a(fn_pt);
for (i = 0; i < 2; i++)
{
char key[2];
sprintf(key, "%d", i);
for (j = 0; j< 5; j++)
{
char value[2];
sprintf(value, "%d", j);
a.insert(pair<char *, char *>(key, value));
}
}
for (i = 0; i < 2; i++)
{
char key[2];
sprintf(key, "%d", i);
multimap<char *, char *>::iterator it = a.find(key);
while (it != a.end())
{
cout << it->first << "t" << it->second <<endl;
it++;
}
}
}
只需将上述程序中的键更改为整数即可获得预期的结果。但是,在字符串上索引多重映射会给我一些意想不到的东西(只有 1 和 4 的行用空格分隔),而不是向我显示使用的每个键值的每个值。
我哪里做错了?
谢谢
strcmp
在multimap
中使用是一个错误的谓词。谓词应满足以下条件:
表达式 comp(a,b),其中 comp 是此比较类的对象,a 和 b 是键值,如果要在严格的弱排序操作中将 a 放置在比 b 更早的位置,则应返回 true。
strcmp
违反了这一点,因为如果字符串不相等,则返回非零值, b。
您应该定义自己的谓词,当且仅当第一个字符串小于第二个字符串时,该谓词才返回true
。
multimap<char *, char *, int (*)(const char *, const char *)>a(fn_pt);
for (i = 0; i < 2; i++)
{
char key[2];
sprintf(key, "%d", i);
for (j = 0; j< 5; j++)
{
char value[2];
sprintf(value, "%d", j);
a.insert(pair<char *, char *>(key, value));
}
}
您将两个指针存储在一个容器中,然后销毁这些指针在超出范围时指向的对象(key
和 value
)。这使得容器中保存的信息现在毫无意义。
您正在使用key
的内存,并且在它们超出范围很久之后value
。事实上,你所有的char*
指针都指向同一个堆栈内存,当你实际查看它时,该片段已经准备好重用。
要执行所需的操作,您需要使用 strdup()
来创建char *
数据的永久副本。当然,然后您需要担心稍后会解除分配它。
相关文章:
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 如何编写用于多映射插入和擦除功能的 API?
- C++,映射插入&&文件流读取导致麻烦
- 多映射插入键类型信息 std::make_pair vs std::p air 构造函数
- 将一个映射插入到同一多重映射的另一个映射中会导致 SEG 错误
- 将元素插入 c++ 映射 - 插入方法的差异
- 使用boost::关联属性映射插入boost::BIMAP..失败
- STL 无序映射 - 插入到向量中
- C++在映射插入期间保证移动
- Visual Studio C++-std::映射插入失败
- C++映射插入
- 标准::映射插入/擦除的并发问题
- 不明确的映射.插入boost
- 无序映射插入复制元素
- 无序映射插入()错误
- 自定义键出现c++映射插入错误
- c++多映射插入两个以上的值
- 使用配对类型的映射插入
- 调试映射插入
- STL映射插入复制构造函数