当前位置: 首页 > 知识库问答 >
问题:

使用std::set实现稀疏三维网格时出错

岳刚洁
2023-03-14

我试图实现一个稀疏的3D网格与std::集容器,但我不能理解从编译器返回的错误,这是我试图运行的最小示例:

#include <iostream>
#include <vector>
#include <limits>
#include <set>

#include <Eigen/Core>

using namespace std;

class Cell {
public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    Cell(const Eigen::Vector3i idx=Eigen::Vector3i::Zero()):_idx(idx) {
        _center = Eigen::Vector3f::Zero();
        _parent = 0;
        _distance = std::numeric_limits<int>::max();
    }

    inline bool operator < (const Cell& c){
        for (int i=0; i<3; i++){
            if (_idx[i]<c._idx[i])
                return true;
            if (_idx[i]>c._idx[i])
                return false;
        }
        return false;
    }

    inline bool operator == (const Cell& c) { return c._idx == _idx;}

private:
    Eigen::Vector3i _idx;
    Eigen::Vector3f _center;
    vector<Eigen::Vector3f> _points;
    Cell* _parent;
    size_t _closest_point;
    float _distance;
    int _tag;
};


int main(int argc, char* argv[]) {

    set<Cell> grid;

    float max = 1, min = -1;
    int dim = 5;
    float delta = (max-min)/(dim-1);

    for(int k = 0; k < dim; k++)
        for(int j = 0; j < dim; j++)
            for(int i = 0; i < dim; i++)
                grid.insert(Cell(Eigen::Vector3i(i,j,k)));

    return 0;
}

这是编译器错误:

在包含的文件从 /usr/include/c /4.8/string:48:0,从 /usr/include/c /4.8/bits/locale_classes.h:40,从 /usr/include/c /4.8/bits/ios_base.h:41,从 /usr/include/c /4.8/ios:42,从 /usr/include/c /4.8/ostream:38,从 /usr/include/c /4.8/iostream:39,从 /home/dede/build/sparse_grid/main.cpp:1: /usr/include/c /4.8/bits/stl_function.h:在 'bool std::less 的实例化中

如果有人能告诉我我做错了什么,我将非常感激。

谢谢,费德里科

共有3个答案

司寇飞航
2023-03-14

您已声明了 参数

只需在循环中创建一个临时的单元格对象,并将其插入单元格中

像这样做:

    for(int k = 0; k < dim; k++)
        for(int j = 0; j < dim; j++)
            for(int i = 0; i < dim; i++)
{
             Eigen::Vector3i(i,j,k) eigenVec;
             Cell  cell(eigenVec);
             grid.insert(cell);
}

您的编译应该会成功。

纪畅
2023-03-14

您已经定义了<代码>运算符

您可以为< code>less提供一个非成员函数,一旦它是const,它就可以使用您的成员函数。

bool operator <(const Cell &a, const Cell &b)
{
    return a < b;
}

但是,std::less将为您提供此功能,前提是您的成员函数是const

袁弘化
2023-03-14

您应该将布尔运算符函数声明为 const 成员:

inline bool operator < (const Cell& c) const {
                                    // ^^^^^
    for (int i=0; i<3; i++){
        if (_idx[i]<c._idx[i])
            return true;
        if (_idx[i]>c._idx[i])
            return false;
    }
    return false;
}

inline bool operator == (const Cell& c) const { return c._idx == _idx;}
                                     // ^^^^^

否则,它们不能与<code>单元格</code>的右值对象一起使用。

 类似资料:
  • 本文向大家介绍C语言实现稀疏矩阵,包括了C语言实现稀疏矩阵的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现稀疏矩阵的具体代码,供大家参考,具体内容如下 效果图: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍实现稀疏数组的C ++程序,包括了实现稀疏数组的C ++程序的使用技巧和注意事项,需要的朋友参考一下 稀疏矩阵是其中大多数元素为0的矩阵。其示例如下。 下面给出的矩阵包含5个零。由于零的数量大于矩阵元素的一半,因此它是稀疏矩阵。 算法 示例 输出结果

  • 请看示例代码(注意 data 的数组下标): -- http://www.kyne.com.au/~mark/software/lua-cjson.php -- version: 2.1 devel local json = require("cjson") local data = {1, 2} data[1000] = 99 -- ... do the other things ngx.

  • 问题内容: 有没有人有正确的代码示例 Jenkins DSL插件中需要设置块来设置git稀疏签出吗? 好像config.xml部分看起来像这样: 问题答案:

  • 我正在使用Jax-RS和Jooq。我想知道如何使用稀疏数据实现REST补丁。 比如说我有一些PoJo。我得到了一个JSON补丁(http://www.restapitutorial.com/lessons/httpmethods.html)请求的对象不完整,只包含应该更改的字段。 我该如何编写这样的处理程序? 我试着接受真实的Pojo对象。我的第一个想法是“如果一个字段为空,我就不更新它”。这是我

  • 8.2.3.1. 稀疏检出 从1.7.0版本开始Git提供稀疏检出的功能。所谓稀疏检出就是本地版本库检出时不检出全部,只将指定的文件从本地版本库检出到工作区,而其他未指定的文件则不予检出(即使这些文件存在于工作区,其修改也会被忽略)。 要想实现稀疏检出的功能,必须同时设置core.sparseCheckout配置变量,并存在文件.git/info/sparse-checkout。即首先要设置Git