none
类或者结构体的数据成员是另一个类或结构体数组,且数组长度不定,且有嵌套。如何实现比较好? RRS feed

  • 问题

  • 假设我有如下C代码:

    typedef struct
    {
        int a;
    }MyStruct1;

    typedef struct
    {
        int a;
        MyStruct1 struct1[10];
    }MyStruct2;

    main()
    {
        MyStruct2 MyStruct[5];
        //很容易的访问数据成员
        MyStruct[0].struct1[4].a = 10;
    }

    上面代码中数组长度都是固定的,且访问数组元素很容易。我现在需要在VC++中实现这个功能,结构体或者类都可以。但要求数组长度可变,

    也就是说长度是动态分配的,同时又能很方便的访问每个数据元素。

    我试过vector类模板,但不清楚怎么实现。或者可以用malloc动态分配内存。请问有什么好的方法吗?

    2017年3月2日 8:45

答案

  • #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct MyStruct1
    {
    	int a1;
    };
    
    struct MyStruct2
    {
    	int a2;
    	vector<MyStruct1*> vec;
    };
    
    int main()
    {
    	vector<MyStruct2*> vec;
    	for (int i = 0; i != 5; ++i)
    	{
    		MyStruct2* pStruct2 = new MyStruct2;
    
    		for (int j = 0; j != 10; j++)
    		{
    			MyStruct1* pStruct1 = new MyStruct1;
    			pStruct1->a1 = j * 2;
    			pStruct2->vec.push_back(pStruct1);
    		}
    		pStruct2->a2 = i;
    		vec.push_back(pStruct2);
    	}
    
    	for (vector<MyStruct2*>::const_iterator iter2 = vec.begin(); iter2 != vec.end(); iter2++)
    	{
    		cout << (*iter2)->a2 << endl;
    		for (vector<MyStruct1*>::const_iterator iter1 = (*iter2)->vec.begin(); iter1 != (*iter2)->vec.end(); iter1++)
    		{
    			cout << (*iter1)->a1 << " ";
    		}
    		cout << endl;
    	}
    
    
    	// delete
    	for (vector<MyStruct2*>::const_iterator iter2 = vec.begin(); iter2 != vec.end(); iter2++)
    	{
    		for (vector<MyStruct1*>::const_iterator iter1 = (*iter2)->vec.begin(); iter1 != (*iter2)->vec.end(); iter1++)
    		{
    			delete (*iter1);
    		}
    		delete (*iter2);
    	}
    
    	cout << "Completed" << endl;
        return 0;
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已建议为答案 Baron Bi 2017年3月3日 1:44
    • 已标记为答案 chair00man 2017年3月3日 2:05
    2017年3月2日 13:41
    版主
  • 您调用了new操作符分配内存,就有责任调用delete来删除他们。最后的那个嵌套的for循环就是用来删除它们的。因为它们之前是new完以后,push_back到vector中的,所以最后需要从vector中一个个的取出来,然后调用delete删除它们。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 chair00man 2017年3月3日 3:06
    2017年3月3日 2:25
    版主

全部回复

  • #include <iostream>
    #include <vector>
    
    using namespace std;
    
    struct MyStruct1
    {
    	int a1;
    };
    
    struct MyStruct2
    {
    	int a2;
    	vector<MyStruct1*> vec;
    };
    
    int main()
    {
    	vector<MyStruct2*> vec;
    	for (int i = 0; i != 5; ++i)
    	{
    		MyStruct2* pStruct2 = new MyStruct2;
    
    		for (int j = 0; j != 10; j++)
    		{
    			MyStruct1* pStruct1 = new MyStruct1;
    			pStruct1->a1 = j * 2;
    			pStruct2->vec.push_back(pStruct1);
    		}
    		pStruct2->a2 = i;
    		vec.push_back(pStruct2);
    	}
    
    	for (vector<MyStruct2*>::const_iterator iter2 = vec.begin(); iter2 != vec.end(); iter2++)
    	{
    		cout << (*iter2)->a2 << endl;
    		for (vector<MyStruct1*>::const_iterator iter1 = (*iter2)->vec.begin(); iter1 != (*iter2)->vec.end(); iter1++)
    		{
    			cout << (*iter1)->a1 << " ";
    		}
    		cout << endl;
    	}
    
    
    	// delete
    	for (vector<MyStruct2*>::const_iterator iter2 = vec.begin(); iter2 != vec.end(); iter2++)
    	{
    		for (vector<MyStruct1*>::const_iterator iter1 = (*iter2)->vec.begin(); iter1 != (*iter2)->vec.end(); iter1++)
    		{
    			delete (*iter1);
    		}
    		delete (*iter2);
    	}
    
    	cout << "Completed" << endl;
        return 0;
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已建议为答案 Baron Bi 2017年3月3日 1:44
    • 已标记为答案 chair00man 2017年3月3日 2:05
    2017年3月2日 13:41
    版主
  • Thank you indeed! 正是我需要的。但是有一个疑问, new的pStruct1和pStruct2不需要delete吗?

    非常感谢!!

    2017年3月3日 1:24
  • 您调用了new操作符分配内存,就有责任调用delete来删除他们。最后的那个嵌套的for循环就是用来删除它们的。因为它们之前是new完以后,push_back到vector中的,所以最后需要从vector中一个个的取出来,然后调用delete删除它们。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 chair00man 2017年3月3日 3:06
    2017年3月3日 2:25
    版主
  • 谢谢您的耐心解答。 我的意思是:new的是MyStruct1,MyStruct2,  但是delete的却是迭代器,这样可以吗?会导致内存泄漏吗?

    MyStruct1* pStruct1 = new MyStruct1;

    不需要  delete pStruct1吗.

    2017年3月3日 13:44