如果您有一个键/值对(或只是键)的有序映射,其中一个明显的操作是获取第一个或最后一个(或键)。
为此,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()
是合理的选择吗?
答案 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.