用步幅获取std::vector的最大元素
Get maximum element of std::vector with strides
我有一个std::vector<float>
,数据布局如下
x1 | y1 | z1 | x2 | y2 | z2 | .... | xn | yn | zn
我正试图找出一种类似STL的方法来获得最大x
元素以及y
或z
明显的
double xyzmax = *std::max_element(myvector.begin(),myvector.end() );
选择绝对最大值,不允许我指定步幅。有没有一些没有for循环的技巧?
您可以使用Boost.Itererator库和Boost::Iterator_facade来创建一个跨步迭代器,它可以用std::vector<float>::iterator
初始化,++it
在底层迭代器上执行it += 3;
。
给定这样一个类型为StrideIt
的迭代器,您可以编写
maxX = *std::max_element(StrideIt(v.begin() + 0), StrideIt(v.end() - 2));
maxY = *std::max_element(StrideIt(v.begin() + 1), StrideIt(v.end() - 1));
maxZ = *std::max_element(StrideIt(v.begin() + 2), StrideIt(v.end() - 0));
这最好是重新定义算法,因为有比迭代器类型多得多的算法。
如果你想要最大的灵活性,你可以让StrideIt
成为一个类模板,它采用类型(在你的例子中是float
)和一个定义步幅的运行时构造器参数(在你例子中是3)。
这里是std::max_element
的一个参考实现。
template<class ForwardIt>
ForwardIt max_element(ForwardIt first, ForwardIt last)
{
if (first == last) {
return last;
}
ForwardIt largest = first;
++first;
for (; first != last; ++first) {
if (*largest < *first) {
largest = first;
}
}
return largest;
}
您可以通过以下方式修改来创建自己的算法:
template<class ForwardIt>
ForwardIt max_element_nth(ForwardIt first, ForwardIt last, int n)
{
if (first == last) {
return last;
}
ForwardIt largest = first;
first += n;
for (; first < last; first += n) {
if (*largest < *first) {
largest = first;
}
}
return largest;
}
当然,它有只使用随机访问迭代器的局限性,但它确实适用于vector
。
double xmax = *max_element_nth(myvector.begin(),myvector.end(), 3);
double ymax = *max_element_nth(myvector.begin()+1,myvector.end(), 3);
double zmax = *max_element_nth(myvector.begin()+2,myvector.end(), 3);
但我宁愿把(x,y,z)值存储在一个结构中,并取一个向量。然后,您可以使用带有自定义比较器的标准max_element
。
相关文章:
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 对 Vector 元素 (C++) 的push_back操作
- 从 std::vector 中选择一个元素,而不是给定元素
- 将 Vector<String > 元素复制到其他 Vector<String>* (1 作为
- 有没有更快的方法可以在 std::vector 中插入元素
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- clang C++17 std::vector over align type 使用 -mavx 编译时元素 SIGSE
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 通过引用传递时访问std::vector的元素
- 有没有函数可以直接获取 std::vector 元素的大小?
- 如何非常快速地将数字添加到 Vector 中的一系列元素中
- 如何安全地擦除 std::vector 中的元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- 如何在一对集合的向量中插入元素?vector<pair<int,set<string>>>