如何生成矢量式列表理解

How to generate vector like list comprehension

本文关键字:列表 何生成      更新时间:2023-10-16

在C++11中,

vector<string> blockPathList;
for(int i = 0; i < blockNum; i++)
{
    blockPathList.push_back(desPath + "part" + to_string(i));
}

是否可以像列表理解一样重写上面的代码,或者更短更简洁?

是否要使用第三方库?Eric Niebler的测距-v3允许:

std::vector<string> blockPathList =
        view::ints(0, blockNum)
        | view::transform([&desPath](int i) {
            return desPath + "part" + std::to_string(i);
        });

这和你在C++中得到的函数列表的理解差不多。

也不漂亮,但也应该完成任务:

int cur = 0;
std::vector<std::string> blockPathList(blockNum);
std::generate(blockPathList.begin(), blockPathList.end(),
        [&](){ return destPath + "part" + std::to_string(cur++); });

不幸的是,这个

  • 需要预先确定矢量大小
  • 需要一个外部迭代变量(因为std::generate Generator不接受任何参数

您也可以使用std::for_each:

std::vector<int> nums(blockNum);
std::iota(nums.begin(), nums.end(), 0);
std::for_each(nums.begin(), nums.end(), [&](int c) {
        blockPathList.push_back(destPath + "part" + std::to_string(c));
        });

但是由于CCD_ 4不产生范围,所以这再次被放大。它用迭代器填充现有的范围,而不是本身充当数字迭代器(当然,你可以通过实现或使用生成迭代器的东西来解决这个问题)

另一个例子(c++14):

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
template<typename CONTAINER, typename LAMBDA>
auto comprehension(CONTAINER&& container, LAMBDA&& lambda){
      std::vector<decltype(lambda(*container.begin()))> w;
      std::transform(container.begin(),container.end(),std::back_inserter(w), lambda);
      return w;
}
int main(){
    auto&& ints = {1,2,3,4,5};
    auto&& squares = comprehension(ints,[](auto i){ return i*i; });
    for( auto s : squares){ std::cout << s << ' '; }
    std::cout << 'n';
}

输出:

1 4 9 16 25