如何使用单个 for 循环遍历 std::map<string,int> 和 std::vector<int>?
Posted
技术标签:
【中文标题】如何使用单个 for 循环遍历 std::map<string,int> 和 std::vector<int>?【英文标题】:How to iterate through a std::map<string,int> and std::vector<int> using single for loop? 【发布时间】:2017-02-10 07:48:36 【问题描述】:如何使用单个 for
循环遍历 std::map<string,int>
和 std::vector<int>
?
我见过this questions,但无法解决我的问题。
我正在尝试这样
map<string,int> data;
data["Shravan"] = 1;
data["Mama"] = 2;
data["Sa1"] = 3;
data["Jhandu"] = 4;
vector<int> values = 1,2,3,4;
for(const auto& it1: data,it2 : values)
// Do something
编辑:我不能一一浏览。因为我在同一个函数中使用std::map
的键和std::vector
的值。这将在for
循环中调用。
两个容器大小相同。
【问题讨论】:
为什么?你想要什么行为;通过一个容器然后另一个?还是可以交错? 看看 cplusplus.com/reference/map/map/begin 和 cplusplus.com/reference/map/map/end ,但需要注意的是,这不是一个好习惯......类似的功能也适用于向量 @BoBTFish :我不能一一经历。因为我在同一个函数中使用了std::map
的键和std::vector
的值。
可能有很好的答案,我希望我能接受所有。但我必须遵守 SO 规则,因此接受一个。
【参考方案1】:
如果您知道两者的长度相同,请使用以下内容:
auto vit = begin(value);
auto mit = begin(data);
for (; vit != end(value); ++mit, ++vit)
// Use mit and vit
【讨论】:
您的代码无法编译。mit
是对 const 的引用,而 ++
运算符不是 const。
适当修改答案【参考方案2】:
做一会儿怎么样?前提是您的容器不是空的。
auto iv = std::begin(value);
auto id = std::begin(data);
do
// Use those iterators
while(++iv != std::end(value) && ++id != std::end(data))
如果您也想处理空容器,请使用while
。
auto iv = std::begin(value);
auto id = std::begin(data);
while(iv != std::end(value) && id != std::end(data))
// Use those iterators
iv++; id++;
【讨论】:
一个简单的while
处理空容器。
@Jarod42 是的,我的代码在空代码上失败。添加它作为前提条件:)【参考方案3】:
考虑在这个答案https://***.com/a/8513803/2210478中讨论的boost::zip_iterator
【讨论】:
@MikeMB 是的,你是对的。我建议的代码是错误的。我已经删除了它。也许 OP 仍然可以检查 zip_iterator。 好的,删除了反对票。如果您添加使用示例,您将获得支持。【参考方案4】:您可以遍历map
和vector
,并确保检查迭代器是否与相应容器的末尾相匹配。
auto map_iter = data.begin();
auto vec_iter = value.begin();
for (; map_iter != data.end() && vec_iter != value.end();
++map_iter, ++vec_iter)
// Use map_iter and vec_iter
【讨论】:
以上是关于如何使用单个 for 循环遍历 std::map<string,int> 和 std::vector<int>?的主要内容,如果未能解决你的问题,请参考以下文章