是否可以用“纯”C++11等效项替换本例中的BOOST_FOREACH?
#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;
}
}关键特性是将键/值对保留在对k和v的引用中。
我试过了:
for(std::tie(k,v) : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}和
auto i = std::tie(k,v);
for(i : map)
{
std::cout << "k=" << k << " - " << v << std::endl;
}但所有基于ranged的for循环想法似乎都不起作用。假设基于范围的for循环需要在:之前有一个声明,因为即使:
std::vector<int> test;
int i;
for (i : test);是无效的。
我能找到的最接近的等价物是:
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?
发布于 2012-05-10 04:42:12
for (auto & i : map)
{
std::tie(k,v) = i;
// your code here
}发布于 2012-05-10 04:48:33
这将产生与Boost宏相同的输出
for( auto const& k : map ) {
std::cout << "k = " << k.first << " - " << k.second << std::endl;
}发布于 2019-09-29 05:58:04
在C++17中,现在可以使用结构化绑定来实现这一点,例如:
#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";
}
}这当然是我在新项目中选择做的事情。
https://stackoverflow.com/questions/10523648
复制相似问题