如何动态创建vector数组,且支持后续的访问

我的需求是,比如现在有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]);
		}		
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值