【问题标题】:Problem with select sort in C++ using swap使用交换在 C++ 中选择排序的问题
【发布时间】:2021-08-01 10:44:17
【问题描述】:

我正在尝试完成这段代码,现在我遇到了选择排序算法的错误:

error: no matching function for call to 
‘swap(const std::vector<int>*, const std::vector<int>*)’
       swap(&adj[min_idx], &adj[j]);

invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
    b = temp;

我必须按图的顶点度数对图进行排序。有人可以帮助我吗?谢谢!

void swap(int *a, int *b) {    
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void sortGraph(vector<int> const *adj, size_t count) {
    int size = count;
        
    //sort by degree, number of children
    for (int j = 0; j < size - 1; j++) {
        int min_idx = j;
        for (int i = j + 1; i < size; i++) {
            if (adj[i].size() < adj[min_idx].size())
                min_idx = i;
        }
        swap(&adj[min_idx], &adj[j]);
    }
}

void printGraph(std::vector<int> const* adj, size_t count) {
    std::vector<size_t> indices;
    for (size_t i = 0; i != count; ++i)
    {
        indices.push_back(i);
    }

    for (auto index : indices)
    {
        std::cout << "Vertex " << index << ", degree " << adj[index].size() << '\n';
    }
}
    
void addEdge(vector<int> adj[], int u, int v) {
    adj[u].push_back(v);
    adj[v].push_back(u);
}
   
int main() {
    int V = 5;
    vector<int> adj[V];
    addEdge(adj, 0, 2);
    addEdge(adj, 0, 1);
    addEdge(adj, 0, 3);
    addEdge(adj, 0, 4);
    addEdge(adj, 2, 1);
    addEdge(adj, 4, 1);
    //printGraph(adj, V);
    sortGraph(adj, V);
    return 0;
}

https://ideone.com/mgffaj

【问题讨论】:

    标签: c++ sorting const-correctness


    【解决方案1】:

    更改签名

    void  sortGraph(vector<int> const* adj, size_t count)
    

    void  sortGraph(vector<int> * adj, size_t count)
    

    您之前已声明 vectorconst,这意味着您不能更改它的内容。交换要求您能够将 non const 指针传递给 int,但您将 const 指针传递给 int。

    我建议你阅读const correctness上的一些文章

    您的代码还存在一些其他问题。您对交换的定义最好通过引用来获取整数。

    
    #include<bits/stdc++.h>
    #include <stdio.h>
    using namespace std;
    
    void swap(int&a, int&b) {    
       int temp;
       temp = a;
       a = b;
       b = temp;
    }
    
    
    void  sortGraph(vector<int> * adj, size_t count){
      int size = count;
        
        //sort by degree, number of children
             for (int j = 0; j < size - 1; j++) {
                int min_idx = j;
                for (int i = j + 1; i < size; i++) {
                  if (adj[i].size() < adj[min_idx].size())
                     min_idx = i;
                }
                swap(adj[min_idx], adj[j]);
        
              }
                
    
    }
    
    
    void printGraph(std::vector<int> const* adj, size_t count)
    {
        std::vector<size_t> indices;
        for (size_t i = 0; i != count; ++i)
        {
            indices.push_back(i);
        }
    
        for (auto index : indices)
        {
            std::cout << "Vertex " << index << ", degree " << adj[index].size() << '\n';
        }
    }
    
    void addEdge(vector<int> adj[], int u, int v)
    {
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    
    
    int main()
    {
    int V = 5;
    vector<int> adj[V];
    addEdge(adj, 0, 2);
    addEdge(adj, 0, 1);
    addEdge(adj, 0, 3);
    addEdge(adj, 0, 4);
    addEdge(adj, 2, 1);
    addEdge(adj, 4, 1);
    //printGraph(adj, V);
    sortGraph(adj, V);
    return 0;
    }
    
    

    现在编译。我没有检查它的运行时正确性。

    https://godbolt.org/z/4r1o9bjez

    (ps 我发现 Godbolt 更方便试用 sn-ps。YMMV)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2018-11-07
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多