Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 帮助学习半复杂C++;分配_C++ - Fatal编程技术网

C++ 帮助学习半复杂C++;分配

C++ 帮助学习半复杂C++;分配,c++,C++,我相信这是一个非常简单的问题,但我非常感谢您的帮助。:) 以下是我在.h文件中的变量: map<int, map<int, map<int, CString>*>*> batch; 为了确保按正确的顺序处理derefs,我在尝试解决这个问题时添加了一些额外的括号-不幸的是,它仍然不起作用。我的应用程序在运行这一行时崩溃了。我将它包装在一个try{}catch{}中,但似乎没有抛出任何异常。我不经常使用C++,我想知道是否有人能告诉我我做的不对。 以下是我试图

我相信这是一个非常简单的问题,但我非常感谢您的帮助。:)

以下是我在.h文件中的变量:

map<int, map<int, map<int, CString>*>*> batch;
为了确保按正确的顺序处理derefs,我在尝试解决这个问题时添加了一些额外的括号-不幸的是,它仍然不起作用。我的应用程序在运行这一行时崩溃了。我将它包装在一个try{}catch{}中,但似乎没有抛出任何异常。我不经常使用C++,我想知道是否有人能告诉我我做的不对。 以下是我试图模拟的关系:

交易编号列表(整数),需要按键排序

对于每个交易编号,我有两种类型的文档、付款和发票(在我上面的数据结构中分别用0和1表示存储桶)

在每个类型的bucket中,可以有一个或多个文档,这些文档需要按id(docid)排序

每个docid链接到一个字符串,该字符串由文件系统上要处理的文件的逗号分隔列表组成

如果您认为有更好的数据结构可供使用,我很想听听

编辑:我知道有很多更好的方法。场景是,我收到了一堆可怕的MFC密码C++代码,并要求昨天完成一些工作。它基本上归结为将数据结构放在那里,加载它,然后输出到其他地方。当我问这个问题的时候,我正想尽快把它弄清楚。不过,我很欣赏这些设计建议

那条线太复杂了


您需要将其分解为更小的部分,将每个部分转换为一个命名变量。

std::map的工作方式是,如果节点尚不存在,它将分配您试图引用的节点。这意味着,除非你分配你的子地图并将它们插入你的超级地图,否则你将得到指向你不拥有的内存的指针。在这一点上,当您试图写入该内存时,您将崩溃

映射是否需要进行堆分配?如果没有,您可以将类型更改为:

map<int, map<int, map<int, CString> > > batch; // don't forget the spaces
如果您申报:

map<int, map<int, map<int, CString> > > batch;//no asterisks!

您可能正在该怪物中的某个点取消对空指针或野生指针的引用。这种事情不会引发异常,它只会导致分段错误(或您的平台的等效错误)。

首先,
typedef
这些事情,它变得更容易:

typedef std::map<int, CString> page_map;
typedef std::map<int, page_map> document_map;
typedef std::map<int, document_map> batch_map;

batch_map batch;
现在,如果您需要调试,您可以轻松地检查这些值,并且更容易看到哪里会出错

我认为,有了更多的信息,我们可以使这项工作更加简单。我想不出你究竟为什么需要这样的东西。

只是为了好玩: 为什么不收集这些呢

typedef int transaction_key;
typedef int doc_id;

class Transaction
{
public:

    Transaction(transaction_key key) : m_key(key) {}

    AddPaymentDoc(doc_id, const std::string&);
    AddInvoiceDoc(doc_id, const std::string&);  
    // I'd probably have these methods return a unique ID actually, rather than 
    // create it yourself...  or they can return void and you pass in the doc id.


    // exception handling/other handling for attempting to reference using a bad id
    std::string GetPayment(doc_id);
    std::string GetInvoice(doc_id);

    std::map <doc_id, std::string> GetPayments() {return Payments;}
    std::map <doc_id, std::string> GetInvoices() {return Invoices;}

private:
    transaction_key m_key;
    std::map <doc_id, std::string> Payments;
    std::map <doc_id, std::string> Invoices;    
};
typedef int transaction_键;
typedef int doc_id;
类事务
{
公众:
事务(事务_key key):m_key(key){}
AddPaymentDoc(doc_id,const std::string&);
AddInvoiceDoc(文档id,常量std::string&);
//我可能会让这些方法返回一个唯一的ID,而不是
//自己创建它…或者他们可以返回void,然后你传入文档id。
//尝试使用错误id引用的异常处理/其他处理
std::字符串GetPayment(doc_id);
std::字符串GetInvoice(doc_id);
std::map GetPayments(){return Payments;}
std::map GetInvoices(){返回发票;}
私人:
交易密钥m密钥;
标准::地图付款;
标准::地图发票;
};

我只是想直接阅读一下您试图将其建模为简单数据结构的内容,最后得出了以下结论

std::map
是一个已订购的容器,因此您最终会得到所需的订购。通过避免显式使用指针,并允许容器管理动态内存,模型使用更简单,更不容易出错

如果您可能需要更多的文档类型,而不仅仅是付款和发票,那么我可能会将文档类型设置为枚举,并将事务设置为从文档类型到
DocumentMap
的映射

#include <map>
#include <string>

// Map of docid to comma separated string of files
typedef std::map<int, std::string> DocumentMap;

struct Transaction
{
    DocumentMap payments;
    DocumentMap invoices;
};

// map of transaction id to transaction contents
typedef std::map<int, Transaction> TransactionMap;

TransactionMap batch;

void foo(TransactionMap& batch)
{
    // ...

    batch[transno].invoices[docno] = page;

    // ...
}
#包括
#包括
//docid到以逗号分隔的文件字符串的映射
typedef std::map DocumentMap;
结构事务
{
文件地图付款;
文档地图发票;
};
//事务id到事务内容的映射
typedef std::map TransactionMap;
事务映射批处理;
void foo(事务映射和批处理)
{
// ...
批次[transno]。发票[docno]=第页;
// ...
}

我同意。这段代码看起来像是一些过早的优化,即试图减少代码行数。地图(及其子部分)是否已填充?您可能正在尝试访问/分配空位置。你想完成什么?对我来说,这看起来像是可怕的代码。还有-docnum和transnum是什么?我同意tim的观点。每当您看到这样的嵌套容器类时,您都需要创建自己的类来表示正在定义的部分或全部数据结构,这是一个好迹象。semirhage,您可以编辑您的问题吗?你的猫一直在键盘上,结果似乎是不可读的,即使是对LISP的爱好者<代码>:^>事实上,如果指针之前没有插入,映射只会发出一个空指针。不用担心不使用指针时的性能:贴图不会围绕其项目进行复制:一旦插入,项目将不再被复制。我将对此进行一次尝试。谢谢,太好了。没有责骂或无用的“可怕”评论。只是对这个问题的回答。谢谢你,先生注意“>”之间缺少的空格(正如fbereteon在回答中指出的那样)。我通常会忘记这些空格,直到它不编译:)+1以使用typedef。不过,我会更进一步,实际使用它们来避免在s上多次使用操作符[]
typedef std::map<int, CString> page_map;
typedef std::map<int, page_map> document_map;
typedef std::map<int, document_map> batch_map;

batch_map batch;
int transNumber = atoi(transnum);
int docNumber = atoi(*docnum); // why is docnum a pointer?

batch[transNumber ][1][docNumber] = page;
typedef int transaction_key;
typedef int doc_id;

class Transaction
{
public:

    Transaction(transaction_key key) : m_key(key) {}

    AddPaymentDoc(doc_id, const std::string&);
    AddInvoiceDoc(doc_id, const std::string&);  
    // I'd probably have these methods return a unique ID actually, rather than 
    // create it yourself...  or they can return void and you pass in the doc id.


    // exception handling/other handling for attempting to reference using a bad id
    std::string GetPayment(doc_id);
    std::string GetInvoice(doc_id);

    std::map <doc_id, std::string> GetPayments() {return Payments;}
    std::map <doc_id, std::string> GetInvoices() {return Invoices;}

private:
    transaction_key m_key;
    std::map <doc_id, std::string> Payments;
    std::map <doc_id, std::string> Invoices;    
};
#include <map>
#include <string>

// Map of docid to comma separated string of files
typedef std::map<int, std::string> DocumentMap;

struct Transaction
{
    DocumentMap payments;
    DocumentMap invoices;
};

// map of transaction id to transaction contents
typedef std::map<int, Transaction> TransactionMap;

TransactionMap batch;

void foo(TransactionMap& batch)
{
    // ...

    batch[transno].invoices[docno] = page;

    // ...
}