我的需求是,比如现在有100个对象,这100个对象都有自己所属的类,可以有其中几个对象是属于同一个类,那么假设这100个对象是属于30个类的,现在想要把属于同一类的对象归到一个数组里面,也就是说我需要创建30个数组。在不知道有多少个类的情况下,我们无法预先创建数组,所以我的思路是先创建一个vector用来存放类的名称,先遍历所有对象,找到它的所属类,这个类第一次出现把这个类名称存入vector,同时动态创建一个vector用来存放属于这一个类的对象,如果遍历到下一个对象也属于这个类,就不用重复压栈这个类名称,而是直接把这个对象压入该类的对象数组,如果遍历到下一个对象属于一个新的类,就把类名称压栈,同时创建该类的对象的动态数组。至于动态创建,可以设置一个计数器,检测到一个新的类计数器就自动+1,可以用这个计数器的值转化为字符串类型作为动态创建的vector的名字,想要根据类访问对象的话,可以用map容器,map<类名,类名的对象数组>,用迭代器遍历map容器就可以操作了
代码是我在项目中用到的,大家可以做个参考,大致就是处理一个表格,第一列是类名,第二列是对象名。CellValue就是读进来的表格
int ClassCount = 0;
CString str_ClassCount, tempStr;
vector<vector<CString>>CLass_Tester;
string temp;
map<CString, vector<CString>>Class_ClassArray;
map<CString, vector<CString>>::iterator iter;
int nRet;
for (int i = 0; i < cell_x; i++)
{
for (int j = 0; j < cell_y; j++)
{
dialog->nRet = std::count(dialog->ClassNamesStdMen.begin(), dialog->ClassNamesStdMen.end(), dialog->CellValue[i][j]);
if (dialog->nRet == 0)//表示类容器中没有该值
{
dialog->ClassNamesStdMen.push_back(dialog->CellValue[i][j]);//获取类名称
// vector<CString>
dialog->str_ClassCount.Format(_T("%d"), dialog->ClassCount);
std::vector<CString>str_ClassCount;//为每一个类动态创建容器
dialog->tempStr = dialog->CellValue[i][j + 1];
dialog->temp= CT2A(dialog->tempStr.GetString());
int pos = dialog->temp.find("_");
dialog->tempStr = dialog->tempStr.Mid(0, pos);
//MessageBox(tempStr);
str_ClassCount.push_back(dialog->tempStr);
dialog->Class_ClassArray.insert((make_pair(dialog->CellValue[i][j], str_ClassCount)));
//Class_ClassArray是创建类的被试容器之后,为了把类和类的容器对应起来,防止表中的类交叉排列的情况
dialog->ClassCount++;
}
else
{
//往创建好的类对应的被试容器添加对象
//if (Class_ClassArray.count(dialog->CellValue[i][j]))//类_被试map有这个类,则向这个类对应的类容器添加对象
//{
dialog->iter = dialog->Class_ClassArray.find(dialog->CellValue[i][j]);
if (dialog->iter != dialog->Class_ClassArray.end())
{
dialog->nRet = std::count(dialog->iter->second.begin(), dialog->iter->second.end(), dialog->CellValue[i][j+1].Mid(0, dialog->CellValue[i][j + 1].Find(_T("_"))));
if (dialog->nRet == 0)
{
dialog->iter->second.push_back(dialog->CellValue[i][j + 1].Mid(0, dialog->CellValue[i][j + 1].Find(_T("_"))));
}
}
//}
}
}
}
访问
iter = Class_ClassArray.find(strChoosed);
if (iter != Class_ClassArray.end())
{
for (int i = 0; i < iter->second.size(); i++)
{
TesterSelect.AddString(iter->second[i]);
}
}