将BOOST_FOREACH替换为 "pure" C++11 替代方案?
Replace BOOST_FOREACH with "pure" C++11 alternative?
是否可以将
此示例中的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 循环需要在 :
之前有一个声明,因为甚至:
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 中简洁地表达同样的事情而没有提升?
for (auto & i : map)
{
std::tie(k,v) = i;
// your code here
}
这将产生与 Boost 宏相同的输出
for( auto const& k : map ) {
std::cout << "k = " << k.first << " - " << k.second << std::endl;
}
在 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";
}
}
这当然是我在较新的项目中选择做的事情。
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- C++11 中不同类型的对象的 std::array 的替代方案
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 是否有一个很好的方法可以在C 11中打印出像JSON一样的Trie结构(仅迭代解决方案)的扁平命名空间
- C++ 11 中 boost::scoped_ptr 的替代方案
- std::optional 的最佳替代方案是从方法返回可选值?(使用 C++98/C++11/C++14)
- c++11 是否提供与 python maketrans/translate 中实现的解决方案类似的解决方案?
- 作用域 Pre C++11 的最佳替代方案
- 将BOOST_FOREACH替换为 "pure" C++11 替代方案?
- C++11 随机数分布在各个平台上并不一致——有什么替代方案
- 函数指针:从性能的角度来看,简单的规范使用是否不好?如果是这样的话,c++11的替代方案是什么
- 是否有一个C++11 strncmp替代方案也能执行
- c++ 11的chrono有哪些替代方案?
- 如何将c++11导入eclipse neon?我的代码给了我错误,我听说这就是解决方案
- 如何在c++11中将迭代器转换为字符串?boost解决方案也可以
- 破解编码面试的LIS解决方案中的分割故障11.7