C++ 在stl多重映射中将对象作为数据拥有

C++ 在stl多重映射中将对象作为数据拥有,c++,stl,map,C++,Stl,Map,我正在编写一个应用程序,其中我希望将字符串存储为键,将自定义对象存储为值 multimap<string, owncreatedobject> mymap; 已将copyconstructor添加到assignmentfunction(调用copyconstructor) 关于“分段错误”有什么想法吗?我假设您正在尝试调用接受多重映射的值类型的插入版本。在这种情况下,请记住多重映射的值类型是std::pair。然后,尝试以下操作: mymap.insert(std::make_p

我正在编写一个应用程序,其中我希望将字符串存储为键,将自定义对象存储为值

multimap<string, owncreatedobject> mymap;
已将copyconstructor添加到assignmentfunction(调用copyconstructor)


关于“分段错误”有什么想法吗?

我假设您正在尝试调用接受多重映射的
值类型的插入版本。在这种情况下,请记住多重映射的
值类型是
std::pair
。然后,尝试以下操作:


mymap.insert(std::make_pair(mystring,myobject));
编辑(在您的评论之后):赋值运算符包含错误。您创建了一个没有任何用途的临时值。下面是使用交换习惯用法的实现建议。(注意,我不知道类成员的类型。假设它们是内置的,例如
int


我怀疑您有一个错误的复制构造函数和/或赋值运算符实现

如果这条线

mymap.insert(std::make_pair(mystring,myobject));
崩溃时,很可能是在“myobject”上执行的某个方法导致了问题。在此代码行中,最有趣的函数是复制构造函数和/或赋值运算符

你说你已经添加了一个赋值操作符(调用复制构造函数),但这听起来很奇怪。通常情况正好相反;复制构造函数根据需要分配资源(即内存),然后调用赋值操作符

更新:阅读您的评论后,下面是您的复制构造函数的外观:

Filter::Filter( const Filter &rhs ) {
    // Apparently no resource acquisition like memory allocation is necessary,
    // so just assign the rhs value.
    *this = rhs;
}
这里是赋值运算符。请注意它是如何复制值的。很可能您根本不需要赋值运算符(或复制构造函数)实现,因为编译器合成的代码适合您使用

Filter &Filter::operator=( const Filter &rhs ) {
    SrcNET = f.SrcNET;
    SrcPort = f.SrcPort;
    DstNET = f.DstNET;
    FlowLabel = f.FlowLabel;
    return *this;
}

查看您为复制构造函数和赋值运算符实现添加的注释,我发现您的赋值运算符实现是错误的。基本上,它没有复制任何内容,而是使用语句
Filter(f);
,您正在创建一个名为
f
的本地对象。您不能那样调用复制构造函数。我建议您编写一个私有复制方法,并在复制构造函数和赋值运算符中使用它。

我在最后一个小时里一直在处理您的问题,我想我已经解决了

尝试使用以下代码段:

multimap<string,yourclass const*> mymap
void addtomap(string s,yourclass const* c)
{
   mymap.insert(pair<string, yourclass const*>(s,c));
}
...`addtomap("abc",&z);
multimap mymap
void addtomap(字符串s,类常量*c)
{
mymap.insert(一对(s,c));
}
…`addtomap(“abc”、&z);

在给定的示例中,您尝试在不使用迭代器的情况下进行插入。多重映射的2元素插入调用的第一个元素是迭代器。这就是分段错误的原因,也是应该使用pair的原因。

能否显示一些有关如何插入元素以及如何使用它们的代码?Object*a;a=new Object(),a->value1=a;a->value2=b;insert(string a,Object b);(错误来了)insert:void Object::insert(string,a,Object b){mymm.insert(pair(a,b));}多重映射是在头private:multimap mymm中定义的;这会编译吗?如果a是指向Object(Object*a;)的指针,那么你怎么做mymm.insert(pair(pair(a,b))}错误来自插入…如果您可以编辑您的问题并发布问题可再现的完整示例代码,则会简单得多。也不要键入代码,只需从编辑器中复制粘贴。我尝试过,但我仍然遇到分段错误。也许我必须为我的对象编写一个分配器?然后,请发布一个小但不完整的示例代码复制问题的代码的相关部分。可能是复制构造函数、程序逻辑或其他方面的错误。我不认为分配器是错误的原因。标头:Filter&operator=(Filter const&f);Filter(const Filter&f);cpp:Filter&Filter::operator=(Filter const&f){if(this!=&f){Filter(f);}return*this;}Filter::Filter(const Filter&f){SrcNET=f.SrcNET;SrcPort=f.SrcPort;DstNET=f.DstNET;DstPort=f.DstPort;FlowLabel=f.FlowLabel;}你的赋值运算符是假的。它根本不会影响“this”。请查看我更新的响应,了解这两个函数应该如何实现。
Filter &Filter::operator=( const Filter &rhs ) {
    SrcNET = f.SrcNET;
    SrcPort = f.SrcPort;
    DstNET = f.DstNET;
    FlowLabel = f.FlowLabel;
    return *this;
}
multimap<string,yourclass const*> mymap
void addtomap(string s,yourclass const* c)
{
   mymap.insert(pair<string, yourclass const*>(s,c));
}
...`addtomap("abc",&z);