Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量不是;“保存价值”;C++;_C++_Vector - Fatal编程技术网

C++ 向量不是;“保存价值”;C++;

C++ 向量不是;“保存价值”;C++;,c++,vector,C++,Vector,当从向量中读取时,我将值放入,得到的大小为零。我有: class Graph { public: vector<Vertex> vertices; }; class Vertex { public: vector<int> adjacentVertices; }; 类图{ 公众: 向量顶点; }; 类顶点{ 公众: 向量邻接顶点; }; 在我的加载方法中,然后: int vertices, edges; cin >> vertices &

当从向量中读取时,我将值放入,得到的大小为零。我有:

class Graph {
public:
    vector<Vertex> vertices;
};

class Vertex {
public:
    vector<int> adjacentVertices;
};
类图{
公众:
向量顶点;
};
类顶点{
公众:
向量邻接顶点;
};
在我的加载方法中,然后:

int vertices, edges;
cin >> vertices >> edges;
Graph mainGraph;
mainGraph.vertices.reserve(static_cast<unsigned int>(vertices));
int tmp1, tmp2;
for (int i = 0; i < edges; i++) {
    cin >> tmp1 >> tmp2;
    mainGraph.vertices[tmp1].adjacentVertices.push_back(tmp2);
    cout << mainGraph.vertices[tmp1].adjacentVertices.size(); //PRINTS NUMBERS -> SEEMS OKAY
}

cout << mainGraph.vertices.size(); //IS ZERO???

for(const Vertex &v : mainGraph.vertices){ //CRASHES
    cout << v.adjacentVertices.size();
}
int顶点、边;
cin>>顶点>>边;
主图;
mainGraph.vertices.reserve(static_cast(顶点));
int-tmp1,tmp2;
对于(int i=0;i>tmp1>>tmp2;
mainGraph.vertices[tmp1]。邻接顶点。向后推(tmp2);
看起来没问题
}
不能改变这一点:

mainGraph.vertices.reserve(static_cast<unsigned int>(vertices));
mainGraph.vertices.reserve(static_cast(顶点));
为此:

mainGraph.vertices.resize(static_cast<unsigned int>(vertices));
mainGraph.vertices.resize(静态投影(顶点));
因为没有创建向量的单元格,这可以通过


因此,在您的代码中,当您执行
mainGraph.vertices[tmp1]
操作时,会调用未定义行为(Undefined Behavior,UB),因为您试图访问尚未构造的对象

保留
不会更改
向量的大小
或构造项。它只分配在添加元素时保留的内存

您对
mainGraph.vertices[tmp1]
的调用未定义,因为它正在访问原始内存


不要使用
reserve
,而是使用
resize
来分配和构造项。

这是因为您试图手动管理向量的大小。让STL动态完成所有工作:

Graph mainGraph;
int edge;

while (cin >> edge)
{
    Vertex newVertex;
    newVertex.adjacentVertices.push_back(edge);
    mainGraph.vertices.push_back(std::move(newVertex));
}

for(const Vertex &v : mainGraph.vertices)
    cout << v.adjacentVertices.size();
Graph主图形;
内缘;
而(cin>>边缘)
{
顶点新顶点;
新建顶点。邻接顶点。向后推(边);
mainGraph.vertex.push_back(std::move(newVertex));
}
用于(常量顶点&v:mainGraph.Vertex)

请发一封信。不是load方法的一个片段。可能重复@UnholySheep,你是对的,但我确实连接了resize/reserve,因为我不知道问题是什么,我想如果将来有人用谷歌搜索同样的问题,可能会发现这很有用。@StoryTeller从意义上讲,它是最小的,它提供了孤立的问题,我没有复制ofc的整个加载方法/程序。但我在这里写的每一件事我都认为可能与问题有关。完成,如上所述。可验证的,我确实以非常清晰的方式描述了正在发生的事情,如果有人想测试这一点,他们可以复制代码并立即自己运行。我认为它是关于比率的(因为最小和完整的例子有点相反的方向),我相信这个比率是正确的。不,不是。我们不知道什么是
顶点
,例如在静态投射中。我们这边没有复制和粘贴代码样本来检查它。阅读链接页面,而不是解释你自己的文本。更准确地说,你试图使用一个尚未构造的对象,因此它是不活动的(尽管内存已经被放在一边)。是的@MaxLanghof,让我们获得精确的、更新的答案,谢谢!我认为这样做效率很低(在我的情况下,因为我正在处理大数据),因为向量的初始大小不是最终大小,在内存中移动数据时,它会调整几次大小。虽然在algo(列表与哈希映射)中的某个地方出错,但影响可能很小,这会让我付出更大的代价,但如果有办法进行优化,为什么不呢德威尔,你没说什么大数据。您描述了问题,我根据您提供的信息编写了一个可能的解决方案。如果你想要一个更合适的解决方案,那么你应该提供关于这个问题的更多细节。顺便说一下:保存数据的任何文件的´std::vector::resize()´都可以防止重复调整容器的大小。是的,这是真的,我没有抱怨你的解决方案当然也是正确的。但是在效率方面,我认为如果你事先知道我的例子中暗示的尺寸,那么调整尺寸总是更好的。无论如何,这对将来的其他人会有帮助,所以谢谢你的回答。:)@eXPRESS•如果您提前知道您的大数据有多大,您可以调用向量上的
reserve
,将向量大小预先调整为您的大数据的准确大小。否则,如果你事先不知道你的大数据有多大,那就让vector来做它的事情。@Eljay我知道:),这就是我最初的问题和答案(分别是我,虽然我也直接将空间分配给vector,这就是问题所在)。