小编bri*_*men的帖子

map::const_iterator 映射类型不是 const

我正在尝试为构建在地图之上的类编写迭代器适配器。尝试从迭代器类型获取映射类型时遇到问题。基本上我想得到:

  • map<Key,Val>::iterator --> Val
  • map<Key,Val>::const_iterator --> Val const

这是一个最小的再现。

#include <map>
#include <type_traits>
    
template <typename BaseIteratorT>
using ValueType = typename BaseIteratorT::value_type::second_type;
    
// Passes
static_assert(
    std::is_same<ValueType<std::map<double, int>::iterator>, int>::value,
    "bad type for mutable iterator");

// Fails
static_assert(
    std::is_same<ValueType<std::map<double, int>::const_iterator>, const int>::value,
    "bad type for const iterator");
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点(C++14)?

c++

5
推荐指数
1
解决办法
75
查看次数

数组的特征向量化

我正在处理点云数据(每个云 150k 点)。我想,对于每个 (x,y) 点,计算到参考点 O 的距离和方位角:

for each point p in points
    dx = p.x - ox
    dy = p.y - oy
    d = hypot(dx, dy)
    az = atan2(dy, dx)
Run Code Online (Sandbox Code Playgroud)

我有一个手动的 SSE 实现。我希望使用特征使代码更清晰:

ArrayXf x(points.size()), y(points.size());
for(unsigned i=0; i<points.size(); ++i) {
    x[i] = points[i].x;
    y[i] = points[i].y;
}
const ArrayXf d = (dx.square() + dy.square()).sqrt();
// implement a polynomial approximation to atan (same as the SSE)
Run Code Online (Sandbox Code Playgroud)

然而,从我的计时实验来看,这似乎根本没有向量化,因为时间与基线实现相同。而且我知道 SSE2 已启用,因为我正在同一文件中编译一些 SSE2 代码。

但是,根据文档,Eigen 在支持时确实利用了 SSE2(以及 3.3 中的 AVX)。它仅用于向量和矩阵运算吗?

编辑:我研究了生成的汇编代码,它确实包含一些 SSE …

sse avx eigen eigen3

4
推荐指数
1
解决办法
2245
查看次数

标签 统计

avx ×1

c++ ×1

eigen ×1

eigen3 ×1

sse ×1