2017-07-31 20 views
-2

の親のベクトルポインタを使用して、親クラスへのポインタを経由してマップのメンバ変数にアクセスします。 CalcError(ノード*ノード、constの文字列&名、ダブル&エラー)では、私は私のコードでは4つのクラス、クラスのデータ、クラスのサンプル、クラスノード、およびクラスツリーを持つ親クラス

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; 
} 

、私は、クラスノード内NodeSamplesに各試料について好きなクラスのデータにDataVariablesマップを反復処理とに渡された名前を比較しますマップ内のキー。 nameがキーに一致する場合は、キーに関連付けられた値を読み取り、セットに格納します。この時点で私はC++ 11の機能を利用することはできません。 C++ 98は私が使用できるものです。 Visual Studioの下の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>が得られます。あなたはmap::findであなたのループの一つを取り除くこと

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

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); 
     } 
    } 
    // ... 
} 
関連する問題