Как использовать set_intersection и вставить в набор - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь построить класс графа, который представлен ребрами и вершинами.

Я реализовал ребра как набор строк, а вершины как набор строк, и хотел бы создавать методы для создания пересечений и объединений между моими созданными графами. Это класс:

class Graph {
public:
    string name;
    std::set<string> vertices;
    std::set<string> edges; //<v1,v2> format
    Graph()= default;
    Graph(const Graph&) = default;
    ~Graph() = default;
    Graph graphUnion(const Graph& graph);
    Graph graphIntersection(const Graph& graph);
};

Я использовал функцию std :: set_intersection для своего метода:

Graph Graph::graphIntersection(const Graph& graph){
    Graph new_graph;
    std::set<string> new_vertices;
    new_vertices.end() = std::set_intersection(this->vertices.begin(), this->vertices.end(), graph.vertices.begin(),
            graph.vertices.end(), new_vertices.begin());
    std::set<string> new_edges;
    new_edges.end() = std::set_intersection(this->edges.begin(), this->edges.end(), graph.edges.begin(),
                                            graph.edges.end(), new_edges.begin());

    new_graph.vertices = new_vertices;
    new_graph.edges = new_edges;

    return new_graph;
}

Тем не менее, когда я пытаюсь запустить его, я получаю следующую ошибку, которая имеет что-то связано с функцией set_intersection в <algorithm>

/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:5415:27: error: no viable overloaded '='
                *__result = *__first1;
                ~~~~~~~~~ ^ ~~~~~~~~~

Пожалуйста, помогите мне определить эту ошибку, так как я не могу сказать, в чем проблема ...

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 августа 2020

.end()

Возвращает итератор, ссылающийся на элемент за концом в контейнере.

Следовательно, вы можете ' t присвоить ему (но вы можете сравнить с ним). Вероятно, вы захотите сделать что-то вроде этого:

std::set<string>::iterator it = std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end());

или

std::set<string> result;
std::set_intersection(v1.begin(), v1.end(),
                      v2.begin(), v2.end(),
                      std::inserter(result, result.begin()));
1 голос
/ 05 августа 2020

Вам понадобится пара вещей:

/*new_edges.end() =*/
std::set_intersection(this->edges.begin(), this->edges.end(), 
    graph.edges.begin(), graph.edges.end(), 
         std::inserter(new_edges, new_edges.begin()));

Не нужно устанавливать конец. Контейнер будет управлять этим сам.

Вам нужен объект вставки, который сообщает, к какому набору добавить и в какой позиции.

...