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个节点左右。和记忆消耗是我关心的问题。
感谢您的帮助。
答案 0 :(得分: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) );
答案 1 :(得分:0)
是的,然后使用指针向量,即
struct node {
node(int nid) : nodeid(nid), data(0), fdata(0) { }
int nodeid;
vector<string *> data;
vector<fTable *> fdata;
}
但要注意内存管理:现在删除节点时,不会删除数据和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;
}
答案 2 :(得分:0)
创建向量并不总是创建其数据:向量的数据在需要时分配,因此没有数据的向量可能会占用sizeof(std:vector<...>)
个字节(如果保留大小为0),以及带有向量的向量数据将实际取sizeof(vector<...>) + n * sizeof(data)
,其中n是向量中保留项的数量。在我的实现中,向量的大小是28个字节。
第一种方法:vector as fields。拥有矢量字段的优点是它们不是动态分配的,可以避免一堆new/delete
手动调用:它更安全。
第二种方法:你也可以像你说的那样使用指针:
struct node
{
int nodeid;
vector<string>* data; // pointer
vector<fTable>* fdata; // pointer
};
您可以将它们设置为0(null),保存向量的大小减去每个节点的指针大小。当你需要一个节点有一个向量时,只需要new
一个向量,并设置适当的指针。但是,这种方法最终会占用比前一个更多的空间,因为它也会占用指针的大小。并且您将必须管理删除(可以使用节点析构函数完成,但在节点销毁之前释放向量可能效率较低)。
结论:我建议您估计数据占用的总大小(例如:10000 * ...),看看是否必须使用特定模型(即先测量)。个人而言,我建议你采取第一个(无指针)。
我还建议您为节点使用构造函数(或两个),以获得更好的代码。