2016-12-01 91 views
-3

我目前正在C++中实现A *寻路算法。我尝试运行我的代码来查看显示网格函数是否正常工作,但是得到了C2678错误:二进制'<':没有发现操作符需要'const Coord'类型的左侧操作数(或者没有可接受的转换) 。错误C2678 C++ A *寻路

我知道我的程序很混乱,可能效率不高,但我试图在优化之前得到一个基本版本。是因为我试图输出一个Coord结构的布尔值的错误?

代码:

#include <iostream> 
#include <fstream> 
#include <chrono> 
#include <thread> 
#include <vector> 
#include <set> 

using std::chrono::milliseconds; 
using std::chrono::duration_cast; 
using std::this_thread::sleep_for; 

typedef std::chrono::steady_clock the_clock; 

struct Location { 
    int g = 0; // Distance covered so far 
    int h = 0; // Estimate of distance to goal 
    float f = 0; // Estimated cost of the complete path 
    bool walkable = 0; // 0 = Walkable, 1 = Wall 
}; 

// Structure 
struct Coord { 
    int x; 
    int y; 
    Location location; 
}; 

// Declare size of grid 
#define WIDTH 10 
#define HEIGHT 10 

typedef Location Array[HEIGHT][WIDTH]; 
Location grid[HEIGHT][WIDTH]; // Create an array of locations 

void displayGrid() { 
    /* Displays the Grid to the console! */ 
    system("CLS"); 
    for (int y = 0; y < HEIGHT; y++) { 
     for (int x = 0; x < WIDTH; x++) { 
      std::cout << grid[y][x].walkable; 
     } 
     std::cout << "\n"; 
    } 
    sleep_for(milliseconds(100)); // Visual delay 
} 

void initialiseGrid() { 
    /* Fills the Grid array with values */ 
    srand((unsigned)time(0)); 

    for (int y = 0; y < HEIGHT; y++) { 
     for (int x = 0; x < WIDTH; x++) { 
      grid[y][x].walkable = 0; 
    } 
} 

/* Test grid */ 
grid[4][2].walkable = 1; 
grid[5][2].walkable = 1; 
grid[4][3].walkable = 1; 
grid[5][3].walkable = 1; 
grid[4][5].walkable = 1; 
grid[5][5].walkable = 1; 
grid[4][6].walkable = 1; 
grid[5][6].walkable = 1; 
} 

void Astar(Coord startPoint, Coord endPoint) { 
    /**/ 
    std::set<Coord> closedSet = {}; // Nodes that do not have to be considered again 
    std::set<Coord> openSet = {}; // Nodes still to be considered to find the shortest path 

    Coord currentNode; // Current node 
    currentNode.x = startPoint.x; 
    currentNode.y = startPoint.y; 
    currentNode.location.g = 0; // 0 Distance from starting point 

    openSet.insert(currentNode); // Insert starting node 

    while (openSet.empty() == false) { // Loop while open list is not empty 

     for (std::set<Coord>::iterator it = openSet.begin(); it != openSet.end(); it++) { // Iterate through each element in the open set to find the lowest F value 
      if ((*it).location.f < currentNode.location.f) { // Check if iterator f value is smaller than the current value 
       currentNode = *it; // Update the current node 
      } 
     } 

     openSet.erase(currentNode); // Drop from the open set since been checked 
     closedSet.insert(currentNode); // Add to the closed set 
    } 
} 


int main(int argc, char *argv[]) { 
    // Set start and end points 
    Coord start; 
    start.x = 3; 
    start.y = 3; 
    Coord end; 
    end.x = 5; 
    end.y = 6; 

    initialiseGrid(); // Put -1 (empty) in 

    // Start timing 
    the_clock::time_point startTime = the_clock::now(); 

    // Stop timing 
    the_clock::time_point endTime = the_clock::now(); 

    // Compute the difference between the two times in milliseconds 
    auto time_taken = duration_cast<milliseconds>(endTime - startTime).count(); 

    displayGrid(); 

    std::cout << "That took: " << time_taken << " ms" << std::endl; 

    return 0; 
} 
+2

请编辑您的问题以提供[mcve]。 –

+0

我没有在您提供的代码中看到operator <的实现。 – drescherjm

+3

['std :: set'](http://www.cplusplus.com/reference/set/set/)需要具有严格弱排序*的元素。你'Coord'结构不提供任何排序​​操作(没有'std :: less'的专门化,没有'operator <()')。因此'std :: set'不知道如何比较你的'Coord'对象和咕噜声。 – dhke

回答

0

解决问题与std::set要求严格弱排序和你Coord类最简单的方法是提供operator <比较在Coordxy值,并返回是否一个Coord小于另一个Coord使用这些值。

您可以std::tie

#include <tuple> 
//... 
struct Coord { 
    int x; 
    int y; 
    Location location; 
    bool operator <(const Coord& c) const 

    // returns true if this->x and this->y < c.x and c.y, false otherwise 
    { return std::tie(x,y) < std::tie(c.x,c.y); } 
}; 

std::tiex成分比较这样做,那么如果相等,比较y组件。返回比较结果(如果第一组x,y组分小于第二组x,y组分,则返回true,否则返回false)。

Live Example here

+0

感谢您的帮助保罗,现在按预期工作。这是我第一次处理严格的弱点排序,所以我不知道发生了什么。欣赏它! –