- ベストアンサー
C++で逐次動的に配列を確保
C++初心者です。 よろしくお願いします。 あるクラスのポインタのリストがあって、末端にはNULLを入れてます。 そのリストをNULLが来るまでfor文で回して クラスのメンバを別で用意した配列に逐次代入したいのですが リスト内に何個クラスがあるのか分からないので、配列を確保できません。 一度回しきってクラスの数を数えてからその分を確保して もう一度回して代入すれば解決は出来ると思うのですが やはり効率が悪いと思うので 効率よく配列を確保できる方法がございましたらご教授よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> リスト内に何個クラスがあるのか分からないので、配列を確保できません。 class classA { public: classA* next; static classA* top; static size_t items; int value; classA(int v) : value(v) { next = top; top = this; ++items; } }; classA* classA::top = nullptr; size_t classA::items = 0; こうすれば classAを作るたびに item が増え、リストの長さと一致する。
その他の回答 (5)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#include <vector> #include <iostream> using namespace std; class classA { public: classA* next; static classA* top; int value; classA(int v) : value(v) { next = top; top = this; } }; classA* classA::top = nullptr; int main() { // copy元を作る for ( int i = 0; i < 10; ++i ) { new classA(i); } // copy先 vector<int> theVector; // 各classA::valueをcopyする for ( classA* p = classA::top; p != nullptr; p = p->next ) { theVector.push_back(p->value); } // 結果を確認 for ( int item : theVector ) { cout << item << ' '; } }
お礼
ありがとうございました!
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> あるクラスのポインタのリストがあって... > クラスのメンバを別で用意した配列に逐次代入したい #include <vector> #include <list> #include <iterator> #include <algorithm> #include <iostream> using namespace std; class Something { public: Something(int v) : val_(v) {} int value() const { return val_; } private: int val_; }; int main() { // copy元を作る list<Something*> theList; for ( int i = 0; i < 10; ++i ) { theList.push_back(new Something(i)); } // copy先 vector<int> theVector; // copy元の各要素に対し、value()を求めcopy先に追加する transform(theList.begin(), theList.end(), back_inserter(theVector), [](Something* s) { return s->value(); }); // 結果を確認 for ( int item : theVector ) { cout << item << ' '; } }
お礼
ありがとうございました!
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> theList.size()はO(n)の計算量がかかる場合もあります。 C++11以降、list::size() の計算量はconstantと規定されています。 要素数がよっぽど大きくない限り、O(N)でも大した時間はかからんですけどね。
お礼
ありがとうございました!
- hanabutako
- ベストアンサー率54% (492/895)
#1の回答について、ちょっと余談ですが theList.size()はO(n)の計算量がかかる場合もあります。 理由は、長さを記録しておらず、質問と同様、リストを全部なめて長さを調べるからですが。 参考までに http://stackoverflow.com/questions/228908/is-listsize-really-on それにしても、学校の課題などでプログラムを書いていて、そう指示されている場合でもない限り、STLを使えるところはSTLを使ったほうがいいでしょうね。
お礼
すいません。 記入不足でした。 リストというのは自作したもので、 //.h class classA { public: classA* next; static classA* top; //略 } //.cpp cEnemy* cEnemy::top = NULL; classA::classA() { // 略 next = top; top = this; } 簡潔に表すとこのような感じです。 この際での解決方法があればお教え頂きたいのですが…
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> あるクラスのポインタのリストがあって std::list<Something*> theList; > クラスのメンバを別で用意した配列に逐次代入したい std::vector<Something> theVector(theList.begin(), theList.end()); または Something** array = new Something*[theList.size()]l; std::copy(theList.begin(), theList.end(), array);
お礼
すいません。 記入不足でした。 リストというのは自作したもので、 //.h class classA { public: classA* next; static classA* top; //略 } //.cpp cEnemy* cEnemy::top = NULL; classA::classA() { // 略 next = top; top = this; } 簡潔に表すとこのような感じです。 この際での解決方法があればお教え頂きたいのですが…
お礼
やはりコンストラクタで静的な変数でカウントするしかないですよね... ありがとうございました!