所以,我有以下情况:
我将整数向量的向量声明为vector < vector<int> > edges
。基本上,我正在尝试使用上面的图形来实现图形,其中图形定义如下:
class graph
{
public:
int vertices;
vector < vector<int> > edges;
};
现在,在插入边缘期间,我将输入作为起始顶点和结束顶点。现在,我想做这样的事情:
void insert(int a, int b, graph *mygraph) // a is starting vertex and b is ending vertex
{
auto it = mygraph->edges.begin();
//int v = 1;
vector<int> foo;
foo.push_back(b);
if (mygraph->edges[a].size() != 0) // Question here?
mygraph->edges[a].push_back(b);
else
mygraph->edges.push_back(foo);
return;
}
现在,在标有Question here
的行中,基本上,我想检查该特定条目的向量是否存在? size
实际上是错误的,因为我试图在不存在的向量上调用大小操作。换句话说,我想检查,如果有一个向量存在于向量向量中的特定位置。我该怎么做?像mygraph->edges[a] != NULL
这样的东西?
答案 0 :(得分:2)
只需检查 a 是否超过向量的大小。如果是,则调整外部矢量的大小。
void insert(int a, int b, graph &mygraph) { // a is starting vertex and b is ending vertex
if (a >= mygraph.edges.size())
mygraph.edges.resize(a+1);
mygraph.edges[a].push_back(b);
}
答案 1 :(得分:1)
您可以通过两种不同的方式解决问题:
将edges
初始化为顶点数,并且不允许在此之后插入其他顶点。那是为什么?
std::vector< std::vector<int> > v = { {1}, {2} };
// now you need to add an edge between vertex 4 and vertex 5
std::vector<int> edges3;
v.push_back(edges3); // v = { {1}, {2}, {} }
std::vector<int> edges4 = {5};
v.push_back(edges4); // v = { {1}, {2}, {}, {5} }
如果你不想这样做,你必须先做这样的事情:
std::vector< std::vector<int> > v;
for (int i = 0; i < maxVertices; i++)
{
std::vector<int> w;
v.push_back(w);
}
// now you need to add an edge between vertex 4 and vertex 5
v[4].push_back(5);
更改用于edges
的结构,可能更适合稀疏矩阵(这看起来像你的情况,因为可能不是每个顶点都连接到每个其他顶点)。尝试:
std::map< int, std::vector<int> > edges;
通过这种方式,您可以将单个顶点与其他顶点列表进行匹配,而无需将edges
初始化为最大可能的顶点数。
std::vector<int> vertices = {5};
edges[4] = vertices;
答案 2 :(得分:0)
边缘是矢量的矢量。向量连续存储在存储器中。您可以从末尾将元素插入到矢量中。如果向量的大小为10,则所有10个成员都是连续的,其索引的范围为0-9。如果删除中间向量,例如第5个,则索引6-9中的所有向量都会向上移动1。
说这一切的重点在于你不会遇到边缘会有一个不能保持向量的索引的情况。要回答您的问题,如果
,将存在索引a的向量a&lt; mygraph-&gt; edges.size();