- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
此代码尝试在多态指针 vector 上使用 copy_if():
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class AbstractBase
{
public:
virtual bool IsDerived1() const { return false; }
virtual void Print() const = 0;
};
class Derived1 : public AbstractBase
{
public:
virtual bool IsDerived1() const { return true; }
virtual void Print() const { cout << "Derived1" << endl; }
};
class Derived2 : public AbstractBase
{
public:
virtual void Print() const { cout << "Derived2" << endl; }
};
// This function returns the elements of v that are of type Derived1.
vector<Derived1*> SelectDerived1(const vector<AbstractBase*>& v)
{
vector<Derived1*> derived1s;
#define USE_COPY_IF 0
#if USE_COPY_IF
// attempt to use copy_if - does not compile:
// /usr/include/c++/4.7/bits/stl_algo.h:990:6:
// error: invalid conversion from 'AbstractBase*' to 'Derived1*'
// [-fpermissive]
copy_if(v.begin(), v.end(), derived1s.begin(),
[](AbstractBase* elem){ return elem->IsDerived1(); });
#else
for (auto it = v.begin(); it != v.end(); ++it)
if ((*it)->IsDerived1())
derived1s.push_back(static_cast<Derived1*>(*it));
#endif
return derived1s;
}
int main()
{
vector<AbstractBase*> v;
Derived1* d1 = new Derived1;
Derived2* d2 = new Derived2;
v.push_back(d1);
v.push_back(d2);
vector<Derived1*> derived1s = SelectDerived1(v);
for (auto it = derived1s.begin(); it != derived1s.end(); ++it)
(*it)->Print();
delete d1;
delete d2;
return 0;
}
代码编译并在 USE_COPY_IF 设置为 0 时正常工作:
$ g++ -std=c++11 test_copy_if.cc
$ ./a.out
Derived1
但我无法让它与 copy_if() 一起工作 - 请参阅评论中的错误消息。
有没有办法?
最佳答案
您可能想要定义一个函数 transform_if
(标准中没有):
template <class InIt, class OutIt, class Pred, class Trafo>
OutIt transform_if (
InIt begin_in, InIt end_in,
OutIt begin_out,
Pred predicate,
Trafo trafo
) {
OutIt itout = begin_out;
for (InIt itin = begin_in; itin != end_in; ++itin) {
if (predicate (*itin)) {
(*itout) = trafo (*itin);
++itout;
}
}
}
然后你可以这样写:
transform_if(v.begin(), v.end(), derived1s.begin(),
[](AbstractBase* elem){ return elem->IsDerived1(); },
[](AbstractBase* elem){ return static_cast<Derived1*> (elem); }
);
或者定义一个transform_and_keep_if
做转换后的检查:
template <class InIt, class OutIt, class Trafo, class Pred>
OutIt transform_and_keep_if (
InIt begin_in, InIt end_in,
OutIt begin_out,
Trafo trafo,
Pred predicate
) {
OutIt itout = begin_out;
for (InIt itin = begin_in; itin != end_in; ++itin) {
auto transformed = trafo (*itin);
if (predicate (transformed)) {
(*itout) = transformed; // or std::move (transformed)
++itout;
}
}
}
然后写:
transform_and_keep_if(v.begin(), v.end(), derived1s.begin(),
[](AbstractBase* elem){ return dynamic_cast<Derived1*> (elem); },
[](Derived1* elem){ return elem != NULL; },
);
关于c++ - 如何多态地使用 copy_if()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18161884/
copy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器。前两个参数定义源序列的输入迭代器,第三个参数是指向目的序列的第一个位置的输出迭代器,第 4 个参数是一
为什么 copy_if 比 copy 慢 我目前正在研究我的 OpenGL 图形引擎。我试图找出将大量对象传递给 GPU 以进行实例化绘制的最佳方法。对我来说最大的问题是有些对象可能会死,所以我创建了
我是 C++ 新手,正在尝试使用 copy_if 函数: set people; // contains people objects set copyedPeople; string name =
如果我知道如何提取匹配类型,是否有一种现代方式来表达有条件地从不同类型的源容器复制到目标容器的意图? 将问题作为代码示例提出更容易: #include #include struct Foo {}
我有一些类的以下方法,它还定义了 isAllowed 方法: auto filter(const auto& in) { auto ret = decltype(in) {}; for
此代码尝试在多态指针 vector 上使用 copy_if(): #include #include #include using namespace std; class AbstractBa
尝试执行以下操作时,我在 thrust 模板的实例化中收到编译时错误: thrust::copy_if(deviceEntries.begin(), deviceEntries.end(), host
我想检查 std::copy_if 的返回值是否有效。像这样 auto it=std::copy_if(s.begin(),s.end(),d.begin(),[&](...){...}); if([
我有一个 string 数组,我想将其复制到 string 的 vector only if 一个特定的 string 的长度等于一个已知值。 function(int len){ string li
在我看来,std::copy_if 对于过滤容器非常有用: std::vector vec { 1, 2, 3, 4 }; auto itEnd = std::copy_if(vec.begin(),
我正在使用 Visual Studio 2010,我正在尝试使用 std::copy_if,我想复制所有满足谓词的值。例如: struct comp { bool operator()(con
这是代码的一部分,我遇到了麻烦 #include #include #include #include #include #include #include #include #include #in
我正在尝试在我的程序中使用 copy_if。我想将一个数组的值每 3 个元素复制到另一个数组中。 基本上,我写了这样一个程序: #include #include #include usin
澄清一下,这就是收集位的意思:(在这个问题的上下文中) size_t gather_bits(size_t source, size_t mask) { size_t result = 0,
我正在尝试使用 copy_if 复制 map (我想将 _citymap 复制到 _the_cities)。这是我的代码: std::map > _citymap; copy_if(_citymap.
完全公开,这可能是一个锤子和钉子的情况,在不需要的时候尝试使用 STL 算法。我在我正在使用的一些 C++14 代码中看到了一个重新出现的模式。我们有一个迭代的容器,如果当前元素符合某些条件,那么我们
假设我们有以下情况: struct A { int i; }; struct B { A a; int other_things; }; bool predicate( con
例如的非迭代器版本all_of 可以写成: template bool all_of(Container s, UnaryPredicate f) { return all_of(s.begin
出现以下错误: RuntimeError: copy_if failed to synchronize: device-side assert triggered 尝试执行时: 如果 torch.no
在 C++ 中没有 std::copy_if 算法有什么具体原因吗?我知道我可以使用 std::remove_copy_if 来实现所需的行为。我认为它是在 C++0x 中出现的,但是一个简单的 co
我是一名优秀的程序员,十分优秀!