C++ 使用构造函数作为谓词

C++ 使用构造函数作为谓词,c++,C++,我们可以使用构造函数作为谓词吗?到目前为止,我能够做到的是: std::vector<const char*> v1 = { "Hello", "from", "GCC", __VERSION__, "!" }; std::vector<std::string> v2(v1.size()); std::transform(v1.begin(), v1.end(), v2.begin(), [] (const char* s) { return std::s

我们可以使用构造函数作为谓词吗?到目前为止,我能够做到的是:

std::vector<const char*> v1 = {
    "Hello", "from", "GCC", __VERSION__, "!"
};
std::vector<std::string> v2(v1.size());
std::transform(v1.begin(), v1.end(), v2.begin(),
    [] (const char* s) { return std::string(s); });
std::vector v1={
“你好”、“来自”、“GCC”、“版本”!”
};
std::vector v2(v1.size());
std::transform(v1.begin()、v1.end()、v2.begin(),
[](const char*s){return std::string(s);});
但是我想要一些方法来做
std::tranform(…,std::string)
。我试过
std::string::string
std::string::basic_string
std::string::basic_string

只要做一个简单的

std::vector<std::string> v2;
v2.reserve(v1.size()); // Not really needed
for(auto x : v1) v2.emplace_back(x);
std::vector v2;
v2.保留(v1.size());//不需要
对于(自动x:v1)v2.向后放置(x);

诀窍是我们需要将
类型名
传递给
模板
,然后我们可以使用它调用所需的构造函数

以下是我的想法:

template<typename source, typename destination, typename iter, typename iter2>
void transform_object(iter begin, iter end, iter2 begin2)
{
    std::transform(begin, end, begin2, [](source s){ return destination(s); } );
}
模板
无效转换对象(iter开始、iter结束、iter2开始)
{
std::transform(begin、end、begin2、[](源){返回目的地;});
}
并将其与原始代码一起使用:

transform_object<const char*, std::string>(v1.begin(), v1.end(), v2.begin());
transform_对象(v1.begin(),v1.end(),v2.begin());
我只想:

std::vector<std::string> v2(v1.begin(), v1.end());
std::vector v2(v1.begin(),v1.end());
构造函数不能这样做。为什么不仅仅是向量v2(v1.begin(),v1.end())?我也不认为在你的问题中使用
std::transform有什么意义,你真的有XY问题吗?我想你的意思是函子不是谓词;谓词返回布尔值。这不是谓词。A是一个过滤标准。具体地说,它是一个函数,它接受一个参数并返回一个
bool
@Deduplicator,这可能是一个哲学问题,但我认为一个真正的谓词(在CS中)需要返回一个布尔值,而有些函数只是为您执行此转换。在C++的上下文中,它们既不需要是函数,也不需要返回<代码> Boo.<代码>,而且,该标准甚至知道所谓的“二进制谓词”,我发现这个词有一个奇怪的扩展。我听说循环的范围不能将内容添加到容器中。但是如果您在容器上循环的范围内,则1)不知道当前元素具有哪些索引,2)不能使容器迭代器无效,因为迭代器为基础的范围。C++底漆。也许我记性不好。@emperueraiman嗯,这不是真的。正如Deduplicator所说的,他们可以添加元素,但他们并非没有缺点。@Deduplicator您可能希望将元素移动到:
v2。emplace_back(std::move(x))
。为什么要使用静态方法创建结构?您可以使其成为一个免费的函数模板,还可以使用
typename iter::value\u type
@0x499602D2修复元素类型。已经习惯了一切的结构。。。这是最简单和最简单的,除非需要一些转换,否则应该优先选择。在这种情况下,的范围将获胜。