如何从一个容器中获取某些元素并将其转换插入到另一个容器中?
How to take certain elements from one container and insert a transform of those into another container?
>我有一个vector<int*>
,我想将所有指向元素的元素放入一个vector<int>
中。 所有非指向元素都设置为nullptr
。
我正在考虑做这样的事情:
vector<int> copy_valid_elements(vector<int*> piv)
{
vector<int> result;
result.reserve(piv.size());
auto end_it = std::remove_if(piv.begin(), piv.end(), [](int* p) { return !p; });
std::transform(piv.begin(), end_it, back_inserter(result), [](int* p) { return *p; });
return result;
}
但这需要不必要地移动数组中的元素。 我可以做一个 for 循环,但我希望有一种算法是std::copy_if
和std::transform
之间的交叉。 有这样的野兽吗?
下面是一个应用可选转换的函数模板,其中包含两个谓词:一个用于筛选,一个用于实际映射。
template <class InpIt, class OutIt, class Pred, class Fct>
OutIt transform_if(InpIt first, InpIt last, OutIt dest, Pred pred, Fct transform)
{
while (first != last) {
if (pred(*first))
*dest++ = transform(*first);
++first;
}
return dest;
}
你可以这样称呼它
int n1 = 1, n2 = 2, n3 = 3;
std::vector<int*> input{&n1, nullptr, nullptr, nullptr, &n2, &n3, nullptr};
std::vector<int> result;
transform_if(input.cbegin(), input.cend(), std::back_inserter(result),
[](auto *i){ return i != nullptr; }, [](auto *i){ return *i; });
另一种可能性是使用范围库,因为它们的主要目的之一是轻松组合算法。使用增强范围:
#include <boost/range/adaptors.hpp>
#include <boost/range/algorithm.hpp>
using namespace boost::adaptors;
/* Variable setup as above... */
boost::copy(input | filtered([](auto *i){ return i != nullptr; }) | indirected,
std::back_inserter(result));
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何从一个容器中获取某些元素并将其转换插入到另一个容器中?
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 保留从一个多集复制到另一个多集的元素的顺序
- 如何从一个向量中删除最小元素并添加到另一个向量,而第一个变为空?
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 从另一个向量中搜索和找到元素的有效方法
- 如果在C 中已经回荡了另一个相同值的阵列元素,请防止循环回荡
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- 如何将元素添加到从另一个线程绑定到 XAML 的 IVector
- 使用对另一个元组不同类型的元素的非常量引用来初始化元组的元素
- 并行算法将向量的元素分配到另一个元素的元素
- C 初始化矢量每个元素,带有另一个向量的参数
- 模板函数,它使用 n_copy 复制前 n 个元素形成一个向量,另一个向量导致编译错误
- 递增迭代器以指向另一个迭代器的下一个元素
- 如何转换一个类方法以修改另一个类的私有元素?
- 将映射从第二个元素复制到另一个地图
- 使用擦除-删除范例将元素从一个向量移动到另一个向量