如何使用单个 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&lt;string,int&gt;std::vector&lt;int&gt;

我见过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】:

您可以遍历mapvector,并确保检查迭代器是否与相应容器的末尾相匹配。

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>?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 std::map 中使用基于范围的 for() 循环?

如何使用基于范围的 for 循环修改地图中的值?

如何遍历地图,修改地图但在每次迭代时恢复?

std::map的操作:插入修改删除和遍历

如何检测 std::map 循环中的最后一次迭代?

防止 Python For 循环通过 char 遍历单个字符串