gpt4 book ai didi

c++ - 标准库中 boost::make_transform_iterator 的等价物是什么?

转载 作者:可可西里 更新时间:2023-11-01 15:23:00 25 4
gpt4 key购买 nike

处理 const vector 时,以下内容不起作用:

const std::vector<std::string> v;
v.push_back("test"); // error: v cannot be modified

相反,您必须在构造它的同一行上初始化 vector 。然而,即使有这个限制,boost::make_transform_iterator使得在将它们插入 v 之前对另一个 vector 的元素做一些事情变得容易。在这个例子中,convert是一个一元函数,返回输入元素的转换版本:

auto beg = boost::make_transform_iterator(args.begin(), convert);
auto end = boost::make_transform_iterator(args.end(), convert);

const std::vector<const char*> vc { beg, end };

我已经查看了 <iterator> 中可用的函数并且看不到等效项。它只是丢失了还是标准库没有它的原因?

最佳答案

对于 C++11,总是有 lambda 就地初始化技巧:

const auto vc = [&]{
std::vector<const char*> tmp(v.size());
std::transform(v.begin(), v.end(), tmp.begin(), convert);
return tmp;
}();

const auto vc = [&]{
std::vector<const char*> tmp;
tmp.reserve(v.size());
std::transform(v.begin(), v.end(), back_inserter(tmp), convert);
return tmp;
}();

查看 Live On Coliru

也就是说,我更喜欢 Boost Range 适配器:(还有 Live On Coliru )

const auto vc = boost::copy_range<std::vector<const char*> >(v | transformed(convert));
#include <algorithm>
#include <vector>
#include <iterator>
#include <string>

#include <functional>
#include <iostream>

int main()
{
const std::vector</* const */ std::string> v { "test", "goodbye" };

auto convert = std::mem_fn(&std::string::c_str);

const auto vc = [&]{
std::vector<const char*> tmp;
tmp.reserve(v.size());
std::transform(v.begin(), v.end(), back_inserter(tmp), convert);
return tmp;
}();

for (auto cc : vc)
std::cout << cc << "\n";
}

关于c++ - 标准库中 boost::make_transform_iterator 的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26073388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com