- 締切済み
振分の問題
テキストデータに "左","1","2","3","4","5" "中","1","2","3","4","5" "右","1","2","3","4","5" "左","1","2","3","4","5" "中","1","2","3","4","5" "右","1","2","3","4","5" とありこれを vector<string> m_tokens; の中に一括で文字列配列としていれています。※カンマは入っていません そこで vector<string> m_tokens_l; vector<string> m_tokens_m; vector<string> m_tokens_r; として for(u_int i=0; i<m_tokens.size(); i++) 左が入っている行なら m_tokens_l.pusu_back(m_tokens[i]); 中が入っている行なら m_tokens_m.pusu_back(m_tokens[i]); 右が入っている行なら m_tokens_r.pusu_back(m_tokens[i]); としていきたいのですが if(i<6*1) m_tokens_l.pusu_back(m_tokens[i]); else if(i<6*2) m_tokens_m.pusu_back(m_tokens[i]); else if(i<6*3) m_tokens_r.pusu_back(m_tokens[i]); ・・・ とはしていきたくないので なんかいい方法としてどなたかご教授お願いします
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。大分強引ですが、参考程度に。 #include<iostream> #include<string> #include<algorithm> #include<functional> #define ArrayCount(a) (sizeof(a)/sizeof(a[0])) #define ArrayEnd(a) (a + ArrayCount(a)) class Class { typedef std::vector<std::string> string_vector; static const string_vector init() { const std::string s[] = { "左123456", "中123456", "右123456", "左123456", "中123456", "右123456" }; return string_vector(s, ArrayEnd(s)); } static void callback(Class* pThis, const std::string& sToken) { pThis->dispatch(sToken); } public: Class() : m_tokens(init()) { typedef std::pointer_to_binary_function<Class*, const std::string&, void> PtrBinFun; std::for_each(m_tokens.begin(), m_tokens.end(), std::bind1st(PtrBinFun(&callback), this)); } ~Class() { } void print() { typedef std::pair<std::string, string_vector(Class::*)> pair; //メンバ変数へのポインタを使って纏めて処理する const pair arrPair[] = { pair("m_tokens_l", &Class::m_tokens_l), pair("m_tokens_m", &Class::m_tokens_m), pair("m_tokens_r", &Class::m_tokens_r) }; for(int i = 0; i < ArrayCount(arrPair); ++i) { const string_vector& r = (this->*arrPair[i].second); std::cout << "/*--------------------------*/" << std::endl; std::cout << arrPair[i].first << std::endl; for(std::size_t n = 0; n < r.size(); ++n) std::cout << r[n] << std::endl; std::cout << "/*--------------------------*/" << std::endl; } } void dispatch(const std::string& sToken) { typedef std::pair<std::string, string_vector(Class::*)> pair; //向きを比較する為にstringの先頭から2バイト分コピーする const std::string sDelta(sToken.begin(), sToken.begin() + sizeof(wchar_t)); //メンバ変数へのポインタを使って纏めて処理する const pair arrPair[] = { pair("左", &Class::m_tokens_l), pair("中", &Class::m_tokens_m), pair("右", &Class::m_tokens_r) }; for(int i = 0; i < ArrayCount(arrPair); ++i) { if(arrPair[i].first != sDelta) continue; (this->*arrPair[i].second).push_back(sToken); break; } } private: string_vector m_tokens; string_vector m_tokens_l; string_vector m_tokens_m; string_vector m_tokens_r; }; int main() { Class cls; cls.print(); return 0; }