【发布时间】:2019-12-02 11:46:58
【问题描述】:
假设我有一个这样的整数向量 std::vector<int> _data;
我知道如果我想从_data 中删除多个项目,那么我可以简单地调用
_data.erase( std::remove_if( _data.begin(), _data.end(), [condition] ), _data.end() );
这比eraseing 多个元素要快得多,因为vector 中需要的数据移动更少。我想知道插入是否有类似的东西。
例如,如果我有以下对
auto pair1 = { _data.begin() + 5, 5 };
auto pair2 = { _data.begin() + 12, 12 };
我可以使用一些现有的std 函数在一次迭代中插入这两个吗?我知道我可以这样做:
_data.insert( pair2.first, pair2.second );
_data.insert( pair1.first, pair1.second );
但这对于大型向量(涉及 100,000 多个元素)来说(非常)慢。
编辑:基本上,我有一个自定义集(和地图),它使用 vector 作为底层容器。我知道我可以只使用std::set 或std::map,但我所做的遍历次数远远超过了插入/删除。从set 和map 切换到这个自定义集/映射已经减少了20% 的运行时间。但目前,插入占用了大约 10% 的剩余运行时间,因此减少这一点很重要。
不幸的是,订单也是必需的。我尽可能使用unordered_ 版本,但在某些地方,顺序确实很重要。
【问题讨论】:
-
也许
reserve()或resie()会有所帮助? -
vector的内部容量已经足够了(预分配20万左右)
-
如果您在中间插入了很多内容,那么您不应该使用
std::vector,而是使用其他东西。什么是“别的东西”?它取决于实际应用 - 您的代码解决的问题。所以基本上你的问题来自XY problem。 -
据我所知,没有标准的库算法。您可能必须自己编写。
-
@walnut,对不起,只是一个例子。我已经换了顺序。