0

C ++ Vector - 它的一部分指向相同的地址

嗨,我的主题可能令人困惑。

就这样吧。

我有一个矢量图

struct node{
int nodeid;
vector<string> data;
vector<fTable> fdata;
}

struct fTable{
int index;
int key;
}

vector<node> myNode;

就像在某些功能上...

void chord::someFunc(int nodeid)
{
    node myTempNode;
    vector<string> data1;
    vector<fTable> fdata1;

    myTempNode.nodeid = nodeid
    myTempNode.data = data1;
    myTempNode.fTable = ftable1;

myNode.push_back(myTempNode);
myTempNode.clear();
}

我将创建 10000 个对象,此时,我只获得了 nodeid 的值。

但是对于数据和 fTable,我设置为一些空字符串向量和空 fTable 向量,但我想知道我是否创建了 10000 个对象并做同样的事情。

我是在创建 10000 个空字符串和 fTable 向量吗

有没有办法可以将所有这些对象指向相同的字符串向量(空值)和 fTable 向量(空值),这样我就可以节省一些记忆。考虑到我将或可能创建 10000 个节点左右。内存消耗对我来说是一个问题。

感谢所有帮助。

4

3 回答 3

1

不,因为向量是空的,所以它们不会占用太多空间,也不会创建字符串或 fTable 对象。

提供您有限的 C++ 知识,我会远离指针并坚持价值观。

您不需要执行任何(立即)以下操作,节点的构造函数会处理这些。这只是用空向量覆盖空向量。

node myTempNode;
vector<string> data1;
vector<fTable> fdata1;

myTempNode.data = data1;
myTempNode.fTable = ftable1;

如果你给你的节点一个这样的构造函数:

struct node{
    int node(int id) : nodeid(id) {}
    int nodeid;
    vector<string> data;
    vector<fTable> fdata;
}

那么你只需要写:

myNode.push_back( node(nodeid) );
于 2013-02-17T10:34:23.717 回答
0

是的,然后使用指针向量,即

struct node {
    node(int nid) : nodeid(nid), data(0), fdata(0) { }
    int nodeid;
    vector<string *> data;
    vector<fTable *> fdata;
}

但是要注意内存管理:现在当一个节点被删除时,data和fdata指向的字符串和fTable并没有被删除。如果这些数据一旦分配就应该归一个节点所有,添加一个析构函数:

struct node {
    node(int nid) : nodeid(nid), data(0), fdata(0) { }
    ~node() {
        for (auto i = data.begin(); i != data.end(); ++i)
            delete *i;
        for (auto i = fdata.begin(); i != fdata.end(); ++i)
            delete *i;
    }
    int nodeid;
    vector<string *> data;
    vector<fTable *> fdata;
}
于 2013-02-17T10:33:52.683 回答
0

创建向量并不总是创建它的数据:向量的数据是在需要时分配的,因此没有数据的向量可能会占用sizeof(std:vector<...>)字节(如果保留大小为 0),而有数据的向量将实际占用sizeof(vector<...>) + n * sizeof(data),其中 n是向量中保留项目的数量。在我的实现中,向量的大小为 28 个字节。

第一种方法:向量作为字段。具有向量字段的优点是它们不是动态分配的,从而使您免于大量new/delete手动调用:它更安全。

第二种方法:您也可以使用指针,如您所说:

struct node
{
    int nodeid;
    vector<string>* data; // pointer
    vector<fTable>* fdata; // pointer
};

您可以将它们设置为 0(空),以保存向量的大小减去每个节点的指针大小。当您需要一个节点有一个向量时,只需new一个向量,并设置适当的指针。但是,这种方法最终会比以前占用更多的空间,因为它也会占用指针的大小。并且您将必须管理删除(可以使用节点析构函数来完成,但在节点销毁之前释放向量的效率可能较低)。

结论:我建议你估计你的数据占用的总大小(例如:10000 * ...),看看你是否必须使用特定的模型(即先测量)。就个人而言,我建议你采取第一个(没有指针)。

我还建议您为节点使用一个(或两个)构造函数,以获得更好的代码。

于 2013-02-17T10:37:36.383 回答