【问题标题】:How to sort an array of structs with std::binary_search or std::sort如何使用 std::binary_search 或 std::sort 对结构数组进行排序
【发布时间】:2014-07-06 23:16:45
【问题描述】:

我有一个排序的结构数组。 我想在上面使用std::binary_searchstd::find

在我所见的任何地方,我都能找到一些示例,这些示例展示了如何使用结构向量来做到这一点。永远不要使用结构数组。我不确定是否必须使用谓词或重载 = 运算符或其他什么。

如果我使用以下调用,std::find 的第三个参数必须是什么:

template< class InputIt, class T > InputIt find( InputIt first, InputIt last, const T& value );

此外,上面的调用将返回一个迭代器或返回最后一个。这如何与结构一起使用。结构没有迭代器,是吗?

【问题讨论】:

  • 数组作为向量也是一样的。如果您使用的是 C 数组,则它们应该是 std::arraystd::beginstd::end 无论如何都可以使用。
  • 没有 std::arrays 就没有办法吗?如果我使用普通的 struct a[MAX] 怎么办?
  • std::beginstd::end 无论如何都可以工作。对于数组,迭代器将是一个指针。指针满足随机访问迭代器的要求。
  • @chris 以及如何告诉std::find 结构的哪个特定数据项用于比较?重载= 运算符?返回值将包含什么?索引?
  • 如任何参考文献中所述,std::finduses operator==,或者您可以使用std::find_if。它返回一个迭代器(这里是指针)指向找到的元素或last

标签: c++ algorithm data-structures stl structure


【解决方案1】:

如果要将其应用于数组arr 的(有效)数组范围[a, b)InputIt 应为std::begin(arr) + aOutputIt 应为std::begin(arr) + b。如果b等于arr中的元素个数,那么你也可以将OutputIt设置为std::end(arr)

std::beginstd::end 在类型为 T 的数组上调用返回 T*。因此,在考虑数组上的这些函数时,您总是可以用 T* 替换 InputItOutputItstd::find 返回一个 InputIt。所以,你得到的是一个指向适当数组元素的指针。如果没有找到,则返回last

【讨论】:

  • 如何解释返回值?
  • @Wildling:对于T类型的原始数组,迭代器类型是指向T的指针。
猜你喜欢
  • 2016-09-11
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多