BTreeMap / VecMap中的最后一项(`back()`)

时间:2015-11-13 18:01:46

标签: rust

如果您有一个键/值对(或只是键)的有序映射,其中一个明显的操作是获取第一个或最后一个(或键)。

为此,C ++的std::vector方便地InitWorkerArray#include <stdio.h> #include <stdlib.h> typedef struct workerT_struct { char *pName; //employee name int maxName; //size, in chars, of the memory buffer to store emp name char *pTitle; //employee title int maxTitle; //size of the memory buffer created to store title } workerT; void initWorkerArray(workerT *pList, int siz); void prntWorker(workerT *pList, int siz, int indx); int main() { int maxRoster = 8; workerT *pRoster; pRoster = (workerT*)malloc(sizeof(workerT) * maxRoster); pRoster = NULL; initWorkerArray(pRoster, maxRoster); return 0; } void initWorkerArray(workerT *pList, int siz) { pList[0].maxName = 32; pList[0].maxTitle = 50; pList[0].pName = malloc(sizeof(char) * maxName); pList[0].pTitle = malloc(sizeof(char) * maxTitle); strcpy(pList[0].pName, "Buggy, Orson"); strcpy(pList[0].pTitle, "Director/President"); strcpy(pList[1].pName, "Czechs, Imelda"); strcpy(pList[1].pTitle, "Chief Financial Officer"); strcpy(pList[2].pName, "Hold, Levon"); strcpy(pList[2].pTitle, "Customer Service"); return; } void prntWorker(workerT *pList, int siz, int indx) { int i = indx; printf("%s, ", pList[i].pName); printf("%s, ", pList[i].pTitle); printf("\n\n"); return; } std::map没有,但front()back()(反向迭代器)对此有效(假设有人知道地图不为空)。

在Rust中,获取地图的第一个元素似乎需要*map.begin() - 丑陋,但考虑到需要进行一些错误检查,这可能是合理的。

但是我们怎样才能得到最后一个元素?通过踩过所有元素:*map.rbegin()

我发现有Iterator::rev()map.iter().next().unwrap()是合理的选择吗?

3 个答案:

答案 0 :(得分:8)

BTreeMap::iter()返回的btree_map::Iter似乎实现了DoubleEndedIterator,所以确实,rev()的方法可以使用,或者你可以使用{{直接1}}方法:

next_back()

事实上,它does起作用。

答案 1 :(得分:0)

Iterator::rev方法要求Self实现DoubleEndedIterator,因此对于您的用例,它应该始终是优化和正确的选择。

fn rev(self) -> Rev<Self>
where
    Self: DoubleEndedIterator,

答案 2 :(得分:0)

https://github.com/rust-lang/rust/issues/31690#issuecomment-184445033

专用方法可以提高可发现性,但是您可以这样做:

let map: BTreeMap<K, V> = ...;
let min = map.iter().next();
let max = map.iter().next_back();
and the same for BTreeSet.