gpt4 book ai didi

c++ - std::transform 到任意容器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:08 25 4
gpt4 key购买 nike

我想编写通用函数,它接收 container1 的值为 [a1, .. , an] 并返回另一个 container2 的值为 [转换(a1),..,转换(an)]。如果 container2std::vector,问题就微不足道了,std::transform 完全符合我的要求。下面的函数可以处理任意的container2container1

template<class ToType, class FromType>
ToType convert(const FromType& from)
{
std::vector<typename ToType::value_type> tmp;
std::transform(from.begin(), from.end(),
std::back_inserter(tmp),
[](const typename FromType::value_type& f) {
return convert<typename ToType::value_type>(f);
});
return ToType(tmp.begin(), tmp.end());
}

但是它做加法复制。有谁知道如何做得更好?

最佳答案

查看 this answerIs it possible to write a C++ template to check for a function's existence? .您可以使用 SFINAE 来检测目标容器的函数是否存在(例如 push_backinsert)或者容器的插入器是否存在(例如 inserter back_inserter),并相应地进行操作。

另一种方法是创建一个伪造的迭代器:

template <class T, class U>
struct ConvertIterator {
typedef T dest_type;
typedef U it_type;

ConvertIterator(U&& val) : iterator(std::forward<U>(val)) {

}

bool operator == (const ConvertIterator &other) const {
return iterator == other.iterator;
}

bool operator != (const ConvertIterator &other) const {
return iterator != other.iterator;
}

dest_type operator * () const {
return convert<dest_type>(*iterator);
}

ConvertIterator<T, U> & operator ++() {
++iterator;
return *this;
}

it_type iterator;
};

然后:

template<class ToType, class FromType>
ToType convert(const FromType& from)
{
typedef ConvertIterator<typename ToType::value_type, decltype(from.begin()) > convert_it;

return ToType(convert_it(from.begin()), convert_it(from.end()));
}

关于c++ - std::transform 到任意容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26730856/

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