如何优雅有效地将矢量元素分组到地图中?

乔皮

我正在将矢量的元素“分组”到地图中,有没有比我目前的方法更有效或更优雅的方法来做到这一点?- 我觉得它在代码方面相当繁琐,并且在性能方面不是最佳的。

我来自 C#,我通常会使用以下方法解决这种情况:

var groupedObservations = observations.GroupBy(o => o.x, o => o.y,o => o.z);

在我当前的 C++ 中,我首先对包含所有元素的向量进行排序,然后使用 if 语句确定何时应该开始新组并将所有后续“相等”元素推入该组。

我目前的代码如下;

struct Observation { int id; double x,y,z; }
vector<std::shared_ptr<Observation>> observations; 

..code that fills observations from csv is omitted ..

map<int,vector<shared_ptr<Observation>>> groupedObservations;


std::sort(observations.begin(), observations.end(), sorting_functor());

int groupId = 0;
double x =0 ,y =0 ,z = 0;
for(shared_ptr<Observation> &observation: observations)
{
    if(!(x == record->x && y== observation->y && z == observation->z))
    {
        groupId++; //coordinates different; new group.
        x = observation->x;
        y = observation->y;
        z = observation->z;

    }
    groupedObservations[groupId].push_back(observation);
}

为完整起见,排序函子如下:

struct sorting_functor
{
    bool operator()(const shared_ptr<Observation> &a, shared_ptr<Observation> &b) const
    {
        return (a->x < b->x) && (a->y < b->y) && (a->z < b->z);
    }
};
思纳特

一个工作示例:

#include <unordered_set>
#include <iostream>
#include <boost/functional/hash.hpp>
#include <tuple>

struct Observation { int id; double x,y,z; };
namespace std
{
template<typename... T>
struct hash<tuple<T...>>
{
    size_t operator()(tuple<T...> const& arg) const noexcept {
        return boost::hash_value(arg);
    }
};

template<>
struct hash<Observation>
{
    size_t operator()(const Observation& o) const
    {
        tuple<double, double, double> t{o.x, o.y, o.z};
        return hash<tuple<double, double, double> >()(t);
    }
};

}

std::ostream& operator<<(std::ostream& os, Observation o) {
    return os<<o.id<<' '<<o.x<<' '<<o.y<<' '<<o.z;
}
bool operator==(const Observation& a, const Observation& b) {
    return a.x==b.x && a.y==b.y && a.z==b.z;
}

int main(int argc, char *argv[])
{
    std::vector<Observation> a = {
        {1, 1.0,1.0,1.1},
        {2, 1.0,1.0,1.1},
        {3, 3.0,3.0,3.3},
        {4, 1.0,1.0,1.1},
        {5, 3.0,3.0,3.3},
        {6, 5.0,5.0,5.5},
        {7, 5.0,5.0,5.5},
        {8, 5.0,5.0,5.5},
        {9, 2.0,2.0,2.2},
        {10,2.0,2.0,2.2},
        {11,5.0,5.0,5.5},
        {12,4.0,4.0,4.4},
    };
    std::unordered_multiset<Observation> words;
    words.insert(a.begin(), a.end());
    for(auto it = words.begin(); it != words.end(); )
    {
        auto cnt = words.count(*it);
        for(auto i=0;i<cnt;i++)
            std::cout << *it++ << '\n';
        std::cout<<'\n';
    }
    return 0;
}

这使

10 2 2 2.2
9 2 2 2.2

11 5 5 5.5
8 5 5 5.5
7 5 5 5.5
6 5 5 5.5

5 3 3 3.3
3 3 3 3.3

12 4 4 4.4

4 1 1 1.1
2 1 1 1.1
1 1 1 1.1

您也可以像以前一样对向量进行排序,然后使用https://github.com/Dobiasd/FunctionalPlus/blob/master/include/fplus/split.hpp,这为您提供了非常干净的代码风格。

auto vector_of_vector = fplus::group(your_vector);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何有效地在地图中插入元素?

来自分类Dev

如何通过ID有效地计算地图中的difftime

来自分类Dev

有效地将元素添加到嵌套地图

来自分类Dev

如何有效地展平地图?

来自分类Dev

如何有效地将日期与指定的时区分组?

来自分类Dev

如何有效地将向量对按第二个值分组?

来自分类Dev

如何有效地将numpy数组中的对应元素相乘?

来自分类Dev

如何有效地将numpy数组中的对应元素相乘?

来自分类Dev

如何有效地将宏变量循环到SAS宏功能中

来自分类Dev

如何有效地将CSS值导入到javascript文件中?

来自分类Dev

如何在C ++中最有效地将像素阵列渲染到窗口?

来自分类Dev

Vulkan-如何有效地将数据复制到CPU *并*等待它

来自分类Dev

如何有效地将切片复制到Rust VecDeque

来自分类Dev

如何在Python中有效地将参数解译到数据库

来自分类Dev

如何有效地将大量数据从CSV文件导入到DataGridView

来自分类Dev

如何有效地将 JavaScript 对象的值隔离到 Array 中?

来自分类Dev

如何有效地过滤并收集具有从几个地图中派生的不同地图值的结果地图?

来自分类Dev

在MATLAB中有效地循环矢量

来自分类Dev

在MATLAB中有效地循环矢量

来自分类Dev

如何用R分组有效地将第一行的NA替换为0

来自分类Dev

如何有效地语法

来自分类Dev

有效地对列表中的相同元素进行分组

来自分类Dev

有效地将值插入地图。更好的递增或递减键?

来自分类Dev

有效地将值插入地图。更好的递增或递减键?

来自分类Dev

C ++有效地存储图块地图图块

来自分类Dev

无需 PL/SQL 即可有效地将行分组为剧集

来自分类Dev

如果从forward_list中仅单个元素,如何有效地将remove_删除?

来自分类Dev

如何有效地将X模Y添加到numpy数组中的每个元素?

来自分类Dev

如何有效地将2维数组中的每个元素乘以Numpy中的1维数组?

Related 相关文章

  1. 1

    如何有效地在地图中插入元素?

  2. 2

    如何通过ID有效地计算地图中的difftime

  3. 3

    有效地将元素添加到嵌套地图

  4. 4

    如何有效地展平地图?

  5. 5

    如何有效地将日期与指定的时区分组?

  6. 6

    如何有效地将向量对按第二个值分组?

  7. 7

    如何有效地将numpy数组中的对应元素相乘?

  8. 8

    如何有效地将numpy数组中的对应元素相乘?

  9. 9

    如何有效地将宏变量循环到SAS宏功能中

  10. 10

    如何有效地将CSS值导入到javascript文件中?

  11. 11

    如何在C ++中最有效地将像素阵列渲染到窗口?

  12. 12

    Vulkan-如何有效地将数据复制到CPU *并*等待它

  13. 13

    如何有效地将切片复制到Rust VecDeque

  14. 14

    如何在Python中有效地将参数解译到数据库

  15. 15

    如何有效地将大量数据从CSV文件导入到DataGridView

  16. 16

    如何有效地将 JavaScript 对象的值隔离到 Array 中?

  17. 17

    如何有效地过滤并收集具有从几个地图中派生的不同地图值的结果地图?

  18. 18

    在MATLAB中有效地循环矢量

  19. 19

    在MATLAB中有效地循环矢量

  20. 20

    如何用R分组有效地将第一行的NA替换为0

  21. 21

    如何有效地语法

  22. 22

    有效地对列表中的相同元素进行分组

  23. 23

    有效地将值插入地图。更好的递增或递减键?

  24. 24

    有效地将值插入地图。更好的递增或递减键?

  25. 25

    C ++有效地存储图块地图图块

  26. 26

    无需 PL/SQL 即可有效地将行分组为剧集

  27. 27

    如果从forward_list中仅单个元素,如何有效地将remove_删除?

  28. 28

    如何有效地将X模Y添加到numpy数组中的每个元素?

  29. 29

    如何有效地将2维数组中的每个元素乘以Numpy中的1维数组?

热门标签

归档