電子書籍の厳選無料作品が豊富!

テキストデータに
"左","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]);
・・・
とはしていきたくないので
なんかいい方法としてどなたかご教授お願いします

A 回答 (1件)

 こんばんは。

大分強引ですが、参考程度に。

#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;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!