我在清理一些旧代码时遇到了问题。这是功能:
uint32_t ADT::get_connectivity_data( std::vector< std::vector<uint8_t> > &output )
{
output.resize(chunks.size());
for(chunk_vec_t::iterator it = chunks.begin(); it < chunks.end(); ++it)
{
uint32_t success = (*it)->get_connectivity_data(output[it-chunks.begin()]);
}
return TRUE;
}
我感兴趣的是将 for 循环清理为 lambda 表达式,但很快就陷入了如何将正确的参数传递给 get_connectivity_data 的问题。get_connectivity_data 通过引用获取 std::vector 并用一些数据填充它。输出包含每个“块”的 std::vector。
基本上我的结论是,让我的代码保持原样更容易、更简洁、更短。
编辑:
因此,正如我所设想的那样,对我的问题最接近的答案是:
std::for_each( chunks.begin(), chunks.end(),
bind( &chunk_vec_t::value::type::get_connectivity_data,
_1,
output[ std::distance( _1, chunks.begn() ]
)
);
然而该代码无法编译,我对代码进行了一些修改以使其编译,但我遇到了 2 个问题:
- _ 1 是一个智能 ptr,std::distance 对它不起作用,我想我需要使用 &chunks[0] 作为开始
- 由于 _ 1 是一个智能指针,我不得不这样做: &chunk_vec_t::value_ type::ValueType::get_connectivity_data 导致 VC9 编译器崩溃...
关于 zip_ 迭代器的答案看起来不错,直到我进一步阅读并发现对于这种特定用途,所需的额外代码量很大(绑定这个和那个等)。
编辑2:
我找到了一个可接受的解决方案,它的无关语法低且清晰,我在此处和下面发布了该解决方案。
std::transform(chunks.begin(), chunks.end(), back_inserter(tmp), boost::bind(&ADTChunk::get_connectivity_data, _1) );