【发布时间】:2012-05-09 20:30:09
【问题描述】:
是否可以将此示例中的BOOST_FOREACH 替换为“纯”C++11 等效项?
#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;
}
但基于范围的 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 中简洁地表达同样的事情而无需提升?
【问题讨论】:
-
在第一个示例中,您不是在每次迭代时都复制一个字符串吗?你真的想要吗?
标签: c++ boost c++11 boost-foreach