KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm porting code that uses a very large array of floats, which may trigger malloc failures from c to c++. I asked a question about whether I should use vectors or deques and Niki Yoshiuchi generously offered me this example of a safely wrapped type: template<typename T> class VectorDeque { private: enum TYPE { NONE, DEQUE, VECTOR }; std::deque<T> m_d; std::vector<T> m_v; TYPE m_type; ... public: void resize(size_t n) { switch(m_type) { case NONE: try { m_v.resize(n); m_type = VECTOR; } catch(std::bad_alloc &ba) { m_d.resize(n); m_type = DEQUE; } break; } } }; I needed a 2D vector of vectors/deque of deques, so I modified it to the following code: template<typename T> class VectorDeque { private: enum STORAGE_CONTAINER { NONE, DEQUE, VECTOR }; std::deque<std::deque<T> > x_d,y_d,z_d; std::vector<std::vector<T> > x_v,y_v,z_v; TYPE my_container; public: void resize(size_t num_atoms, size_t num_frames) { switch(m_type) { case NONE: try { x_v.resize(num_atoms); for (unsigned int couter=0;couter < num_frames; counter++) x_v[counter].resize(num_frames); y_v.resize(num_atoms); for (unsigned int couter=0;couter < num_frames; counter++) y_v[counter].resize(num_frames); z_v.resize(num_atoms); for (unsigned int couter=0;couter < num_frames; counter++) z_v[counter].resize(num_frames); my_container = VECTOR; } catch(std::bad_alloc &e) { x_d.resize(num_atoms); for (unsigned int couter=0;couter < num_frames; counter++) x_d[counter].resize(num_frames); y_d.resize(num_atoms); for (unsigned int couter=0;couter < num_frames; counter++) y_d[counter].resize(num_frames);
Tags (comma-separated)
Save Edits
Cancel