の親のベクトルポインタを使用して、親クラスへのポインタを経由してマップのメンバ変数にアクセスします。 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**);
}
}
}
}
助けていただければ幸いです。
あなたのゲッターは返す必要がありますコピーを避けるためのconst参照(同じコンテナのイテレータを使用する) – Jarod42
'vector'や' map'を明示的に構築する必要はなく、デフォルトコンストラクタで十分です。 – Jarod42