首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用“纯”C++11替换BOOST_FOREACH?

用“纯”C++11替换BOOST_FOREACH?
EN

Stack Overflow用户
提问于 2012-05-10 04:30:09
回答 3查看 6.4K关注 0票数 19

是否可以用“纯”C++11等效项替换本例中的BOOST_FOREACH

代码语言:javascript
复制
#include <map>
#include <functional>
#include <boost/foreach.hpp>
#include <iostream>

int main() {
  std::map<int, std::string> map = {std::make_pair(1,"one"), std::make_pair(2,"two")};
  int k;
  std::string v;
  BOOST_FOREACH(std::tie(k, v), map) {
    std::cout << "k=" << k << " - " << v << std::endl;
  }
}

关键特性是将键/值对保留在对kv的引用中。

我试过了:

代码语言:javascript
复制
for(std::tie(k,v) : map)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}

代码语言:javascript
复制
auto i = std::tie(k,v);
for(i : map)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}

但所有基于ranged的for循环想法似乎都不起作用。假设基于范围的for循环需要在:之前有一个声明,因为即使:

代码语言:javascript
复制
std::vector<int> test;
int i;
for (i : test);

是无效的。

我能找到的最接近的等价物是:

代码语言:javascript
复制
for (auto it = map.begin(); it!=map.end() && (std::tie(k,v)=*it,1); ++it)
{
  std::cout << "k=" << k << " - " << v << std::endl;
}

这并不像BOOST_FOREACH版本那样简洁!

在C++11中,有没有一种方法可以简洁地表达相同的东西而不需要boost?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-10 04:42:12

代码语言:javascript
复制
for (auto & i : map)
{
    std::tie(k,v) = i;
    // your code here
}
票数 26
EN

Stack Overflow用户

发布于 2012-05-10 04:48:33

这将产生与Boost宏相同的输出

代码语言:javascript
复制
for( auto const& k : map ) {
  std::cout << "k = " << k.first << " - " << k.second << std::endl;
}
票数 3
EN

Stack Overflow用户

发布于 2019-09-29 05:58:04

在C++17中,现在可以使用结构化绑定来实现这一点,例如:

代码语言:javascript
复制
#include <map>
#include <string>
#include <iostream>

int main() {
  const std::map<std::string, std::string> map = {std::make_pair("hello", "world")};
  for (auto& [k,v]: map) {
    std::cout << "k=" << k << ", v=" << v << "\n";
  }
}

这当然是我在新项目中选择做的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10523648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档