2017-07-31 50 views
-2

我在我的代码中,类Data,类Sample,类节点和类树中有四个类。通过指向父类的指针访问映射成员变量使用父类的父类的向量指针

class Data 
{ 
private: 
    map<string, double> m_DataVariables; 

public: 
    Data(); 
    Data(const Data &data); 

    map<string, double> getDataVariables() const; 
    void setDataVariables(const map<string, double> &value); 
}; 

class Sample 
{ 
private: 
    Data *m_pData;   // Pointer To The Map Of DataVariables 

public: 
    virtual ~Sample() 
    { 
     delete m_pData; 
    } 

    Sample(); 
    Sample(const Sample &sample); 

    // Data Variables  
    map<string, double> getDataVariables() const; 
    void setDataVariables(const map<string, double> &value); 
}; 

class Node 
{ 
private: 
    double m_numSamples; 
    vector<Sample*> m_NodeSamples; 

public: 
    virtual ~Node() 
    { 
    } 

    Node(); 

    // Number of samples for the node 
    double getNumSamples() const; 
    void setNumSamples(const double &value); 

    // List of Samples 
    vector<Sample*> getSamples() const; 
    void setSamples(const vector<Sample*> &value); 
}; 

class Tree 
{ 
private: 
    vector<Sample*> m_Samples; 
    vector<Node*> m_nodes; 

public: 
    Tree(vector<Sample*> &Samples); 

    // List of Sample 
    vector<Sample*> getSamples() const; 
    void setSamples(const vector<Sample*> &value); 

    // List of Nodes 
    vector<Node*> getNodes() const; 
    void setNodes(const vector<Node*> &value); 

    // List of Names that were used in building the tree 
    vector<string> getPredictorNames() const; 
    void setPredictorNames(const vector<string> &value); 

    void CalcError(Node *node, const string &Name, double &error); 

}; 

Data::Data() 
{ 
    m_DataVariables = map<string, double>(); 
} 

map<string, double> Data::getDataVariables() const 
{ 
    return m_DataVariables; 
} 


Sample::Sample(const Sample &sample) 
{ 
    m_pData      = new Data(); //Map of Variables 
    m_pData->getDataVariables() = sample.getDataVariables(); 
} 

map<string, double> Sample::getDataVariables() const 
{ 
    return m_pData->getDataVariables(); 
} 

double Node::getNumSamples() const 
{ 
    return m_numSamples; 
} 

vector<Sample*> Node::getSamples() const 
{ 
    return m_NodeSamples; 
} 


void Tree::Tree() 
{ 
    m_Samples = vector<Sample*>(); 
    m_nodes = vector<Node*>(); 
} 

vector<Sample*> Tree::getSamples() const 
{ 
    return m_Samples; 
} 

vector<Node*> Tree::getNodes() const 
{ 
    return m_nodes; 
} 

在CalcError(节点*节点,常量字符串&名,双&误差),我想为在类节点的NodeSamples每个样品,通过DataVariables地图类数据迭代和传递的名称进行比较在地图上的关键。如果名称与密钥匹配,则读取与该密钥关联的值并将其存储在一个集合中。目前我无法使用C++ 11功能。 C++ 98是我可以使用的。

在根据视觉工作室此C#是简单使用:

列表中值= node.Samples.Select(S => s.DataVariables [名称])的OrderBy(V => v)的.ToList();

但在C++中,我不确定如何完成此操作。我开始的是:

void Tree::CalcError(Node *node, const string &name, double &error) 
{ 
    vector<double> Values; 

    for (vector<TrainingSample*>::iterator SampleIt = node->getTrainingSamples().begin(); SampleIt != node->getTrainingSamples().end(); SampleIt++) 
    { 
     for (map<string, double>::iterator map_iter = **Not sure how to access the map....** map_iter++) 
     { 
      if (name.compare(**Not sure how to access the key in the map**) == 0) 
      { 
       Values.push_back(**Not sure how to access the value in the map**); 
      } 
     } 
    } 
} 

任何帮助将不胜感激。

+0

你消气应该返回避免副本的const引用(以及使用相同容器的迭代器)。 – Jarod42

+0

您不必显式构造'vector'或'map',它们的默认构造函数就足够了。 – Jarod42

回答

0

的地图迭代器基本上得到你std::pair<KeyType,ValueType>,从而可以访问的东西,如:

for (map<string, double>::iterator map_iter = DataVariables.begin(); 
    map_iter != DataVariables.end(); 
    ++map_iter) { 
    if (name.compare(map_iter->first) == 0) { 
        // ^^^^^^^^^^^^^^^ Access the key 
     Values.push_back(map_iter->second); 
         // ^^^^^^^^^^^^^^^^ Access the value 
    } 
} 
+0

@ Jarod42固定。 – user0042

0

你可以摆脱你的循环中的一个与map::find

void Tree::CalcError(Node* node, const string& name, double& error) 
{ 
    vector<double> Values; 
    const vector<TrainingSample*>& samples = node->getTrainingSamples(); 

    for (vector<TrainingSample*>::const_iterator SampleIt = samples.begin(); 
     SampleIt != samples.end(); 
     ++SampleIt) 
    { 
     const TrainingSample& sample = **SampleIt; 
     const std::map<string, double>& m = sample.getDataVariables(); 
     std::map<string, double>::const_iterator map_iter = m.find(name); 

     if (map_iter != m.end()) 
     { 
      Values.push_back(map_iter->second); 
     } 
    } 
    // ... 
}