C++ 通过引用传递一个图形(列表列表)作为参数,我想向每个列表添加元素,这些元素只在这个函数中使用

C++ 通过引用传递一个图形(列表列表)作为参数,我想向每个列表添加元素,这些元素只在这个函数中使用,c++,graph,C++,Graph,我有一个函数,它接收一个有向图,表示为需要执行此操作的列表列表: int Algo::test(const vector<vector<int> > &graph) { ... // Add a few edges to the graph // Do calculations based on the graph } (2) 不要使用const,将每个列表的当前大小保存在原始图形中,对其进行修改,最后删除添加的元素: vector<

我有一个函数,它接收一个有向图,表示为需要执行此操作的列表列表:

int Algo::test(const vector<vector<int> > &graph) {
    ...
    // Add a few edges to the graph
    // Do calculations based on the graph
}
(2) 不要使用
const
,将每个列表的当前大小保存在原始图形中,对其进行修改,最后删除添加的元素:

vector<unsigned> origSizes(graph.size());
for (unsigned i = 0; i < graph.size(); i++) 
    origSizes[i] = graph[i].size();

// Create edges and do calculations

for (unsigned i = 0; i < graph.size(); i++) 
    graph[i].erase(graph[i].begin() + origSizes[i], graph[i].end();
vector origSizes(graph.size());
for(无符号i=0;i
我不喜欢解决方案(1),因为复制整个图对我来说似乎开销太大(图可能很大)。我不喜欢解决方案(2),因为我更喜欢使用
const
,而不是在内部修改原始图


是否有比这两个选项更有效和/或更安全的其他替代方法?

您可以使用自己的数据结构扩充图形:

int Algo::test(const vector<vector<int> > &graph) {
    vector<vector<int> > extra_edges(graph.size());
    // Add the edges to extra_edges
    // Do stuff using both extra_edges and graph
    ...
}
int算法::测试(常量向量和图形){
向量额外_边(graph.size());
//将边添加到额外的_边
//使用额外的边和图形做一些事情
...
}
将所需的边添加到
附加边
。实际执行计算时,请确保检查原始边和通过
附加边
添加的边


缺点是,它使代码变得更复杂,但是这是除了复制所有内容之外干扰最小的方法。

如果函数需要修改图形,为什么要使用const?它是否需要内部修改版本,还是应该在返回时修改图形?您使用的是向量的向量,而不是列表,等等你在列表中的不同,但使用向量。是什么?(是的,我知道你在概念上讲,而不是用C++术语。不,这不会改变我的评论)在计算机科学术语中,C++中的向量。这应该是从上下文中清楚的。修改后的版本只在内部使用,而不是在外部使用。为什么要初始化<代码>外边> /代码>长度相等(容量)。关于输入图?感谢Rufflewind,这确实增加了代码的复杂性,但似乎是目前为止最好的方法。我可能会这样做,我想避免这样做,因为我保留了一些额外的数据结构来加速我的算法,这实际上可能会使代码变得非常复杂。但我没有给出我的算法的任何细节,所以…可能会这样做它。@haavee我在这里假设一个邻接列表表示。
int Algo::test(const vector<vector<int> > &graph) {
    vector<vector<int> > extra_edges(graph.size());
    // Add the edges to extra_edges
    // Do stuff using both extra_edges and graph
    ...
}