Ну, я понимаю, что это уже проблема, и я выполнил несколько объяснений, но мне все еще не повезло. Может быть, есть объяснение, которое я не видел во время моего поиска, или я делаю что-то не так.копировать данные одного объекта другому объекту того же типа C++
Я создал график, и я пытаюсь скопировать данные с одного графика на другой график. Это много работает. Однако у меня возникают проблемы с их разделением.
graph_maker temp_graph;
temp_graph = kruskal_graph;
for(unsigned int j = 0; j < min_edges.size(); j++){
temp_graph.add_undirected_edge(min_edges[j].node1, min_edges[j].node2, min_edges[j].edge_dist);
if(check_cycle(temp_graph) == true)
temp_graph = kruskal_graph;
else
kruskal_graph = temp_graph;
}
temp_graph
и kruskal_graph
имеет тот же тип называется graph_maker
. Когда я выполняю функцию add_undirected_edge()
, край добавляется к обоим объектам. Для того, чтобы держать их отдельно, я попробовал перегрузить оператор присваивания для класса graph_maker
:
v_map
структура, содержащая данные, которые мне нужно. Я также пробовал следующее:
graphmaker& operator=(graphmaker other)
{
using std::swap;
swap(v_map, other.v_map);
return *this;
}
Но ни один из этих методов не разделяет два объекта. Для обоих, когда я добавляю край, он добавляется к первой строке после цикла for. Я чувствую, что делаю какую-то простую ошибку, но мне трудно понять, почему.
Благодарим вас за ввод.
редактировать:
struct vertex
{
vector <pair<float,vertex*>> adj; //cost of edge, destination vertex
string name;
vertex(string s){
name=s;
}
};
class graphmaker
{
public:
/*
graphmaker& operator=(graphmaker other)
{
using std::swap;
swap(v_map, other.v_map);
// repeat for other member variables;
return *this;
}*/
graphmaker& operator=(const graphmaker& Other)
{
v_map = Other.v_map;
return *this;
}
//typedef map<string, vertex *> map;
map<string, vertex *> v_map;
void add_vertex(const string&);
void add_directed_edge(const string& from, const string& to, float cost);
void add_undirected_edge(const string& node1, const string& node2, float cost);
void make_graph(const string& name);
};
Когда вы говорите каждый динамический член с новым. Для этого случая это будет просто v_map, будет ли это правильно? Мой граф в настоящее время представляет собой карту (v_map) вершин, и каждая из моих вершин содержит имя вершины и вектор пар, которые содержат связанную вершину назначения и вес. – user2427671
@ user2427671, можете ли вы показать определение v_map? –
@ user2427671, да, вам нужно инициализировать все указатели вершин в v_map с помощью new, тогда вы можете constrcut member adj использовать эти новые указатели. –