【发布时间】:2023-04-03 16:57:01
【问题描述】:
我有一个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 之间的交叉。有这样的野兽吗?
【问题讨论】:
-
为什么会有一个指针的向量?它们是指向 single 值的指针,还是指向动态分配的数组的指针?如果是第一个,为什么要指针?如果是后者,为什么不是向量的向量?
-
标准库并非旨在包含所有可能的算法,而是一组核心示例 - 我之前已经编写了
transform_if,这很容易。遗憾的是,目前的模型并不容易支持组合算法——建议的范围库在某种程度上可以帮助解决这个问题。您也可以考虑将boost::filter_iterator输入std::transform。 -
如果你不需要使用
algorithm,它只是for(...){if(...)push_back(...)} -
@appleapple 重点不是说这是一个特别难解决的问题,而是很容易不优雅地解决 - 使用命名且易于理解的算法比
for循环更清楚地表达意图,并且不太可能在以后进行调整/添加,从而使行为略有不同,因此不太清楚。 -
@BoBTFish 我个人觉得
algorithm很混乱。如果它可以像LINQ那样简单易用,我可能会改变主意。但就像现在一样,普通的range based for(可能在具有正确名称的函数中)对我来说非常清晰和灵活。
标签: c++ stl-algorithm