基本问题 std::map 怎么快速访问第几个位置的元素?

时间:2021-07-06 22:12:31
std::map<std::string, int> xxx;
xxx["fdas"] = 1
xxx["xx"] = 2

std::map::iteraotr iter = xxx.begin();
我如何能够快速的访问map的第2个元素 “xx" 呢?
std::map 我知道存储的是一个树结构不能像vector那样操作,但可以iter++ 为什么不能 iter+1?

11 个解决方案

#1


但可以iter++ 为什么不能 iter+1?


楼主知道 iterator 分为哪几种类型吗?

#2


std::map 我知道存储的是一个树结构不能像vector那样操作,但可以iter++ 为什么不能 iter+1?
因为map的迭代器不是随即访问迭代器。所以不能iter+1

#3


std::vector::iterator 
std::map::iterator 
是不同的迭代器这我知道

我的问题是
让我写for去iter++指定的次数到指定的位置 为什么不让 iter+X 直接过去?

或者有什么其他办法? 

#4


用过 advance() 没,不过它是引用传参,没返回值,需要的话给它包装一下。

#5


引用 3 楼 liquidx 的回复:
std::vector::iterator
std::map::iterator
是不同的迭代器这我知道

我的问题是
让我写for去iter++指定的次数到指定的位置 为什么不让 iter+X 直接过去?

或者有什么其他办法?


请看我在2楼给你的提示

#6


恩   感谢pengzhixi

能告诉我有什么办法快速访问 达到我的需求吗?  不要让我for

#7


可以find一下
iter = xxx.find("xx");
iter就是"xx"的位置

#8


没什么技巧,因为map的数据结构注定了。直接用自带的find函数吧

#9


引用 6 楼 liquidx 的回复:
恩   感谢pengzhixi

 能告诉我有什么办法快速访问 达到我的需求吗?  不要让我for

lz好好复习数据结构。

#10


除了 advance 外,稍微麻烦一点的,就是做个适配器,提供随机访问迭代器接口。
你自己斟酌吧,貌似 advance 的类包装版。。。

#11


map,set的设计是为了快速查找元素。
所以设计为红黑树或平衡二叉树。

如果楼主有随机访问的需求,
要直接访问第二个元素。
请使用vector。

如果是对组,可以使用,
vector< pair<std::string, int> > 

iter + n == 随机访问,
是要内存连续存储的,如vector,string。

map,set最好也不要++iter。
效率太低。

#1


但可以iter++ 为什么不能 iter+1?


楼主知道 iterator 分为哪几种类型吗?

#2


std::map 我知道存储的是一个树结构不能像vector那样操作,但可以iter++ 为什么不能 iter+1?
因为map的迭代器不是随即访问迭代器。所以不能iter+1

#3


std::vector::iterator 
std::map::iterator 
是不同的迭代器这我知道

我的问题是
让我写for去iter++指定的次数到指定的位置 为什么不让 iter+X 直接过去?

或者有什么其他办法? 

#4


用过 advance() 没,不过它是引用传参,没返回值,需要的话给它包装一下。

#5


引用 3 楼 liquidx 的回复:
std::vector::iterator
std::map::iterator
是不同的迭代器这我知道

我的问题是
让我写for去iter++指定的次数到指定的位置 为什么不让 iter+X 直接过去?

或者有什么其他办法?


请看我在2楼给你的提示

#6


恩   感谢pengzhixi

能告诉我有什么办法快速访问 达到我的需求吗?  不要让我for

#7


可以find一下
iter = xxx.find("xx");
iter就是"xx"的位置

#8


没什么技巧,因为map的数据结构注定了。直接用自带的find函数吧

#9


引用 6 楼 liquidx 的回复:
恩   感谢pengzhixi

 能告诉我有什么办法快速访问 达到我的需求吗?  不要让我for

lz好好复习数据结构。

#10


除了 advance 外,稍微麻烦一点的,就是做个适配器,提供随机访问迭代器接口。
你自己斟酌吧,貌似 advance 的类包装版。。。

#11


map,set的设计是为了快速查找元素。
所以设计为红黑树或平衡二叉树。

如果楼主有随机访问的需求,
要直接访问第二个元素。
请使用vector。

如果是对组,可以使用,
vector< pair<std::string, int> > 

iter + n == 随机访问,
是要内存连续存储的,如vector,string。

map,set最好也不要++iter。
效率太低。