我有兩個等長的整數向量。假設我想刪除第一個向量中的所有項目,即NAN。顯然,我使用remove_if算法。假設這刪除了索引1,2,5處的元素。然後我想從這些索引中的第二個向量中移除項目。根據一個向量中的值從兩個向量中刪除項目
什麼是最典型的C++方法呢?
我有兩個等長的整數向量。假設我想刪除第一個向量中的所有項目,即NAN。顯然,我使用remove_if算法。假設這刪除了索引1,2,5處的元素。然後我想從這些索引中的第二個向量中移除項目。根據一個向量中的值從兩個向量中刪除項目
什麼是最典型的C++方法呢?
使用一個vector<pair<int, int>>
到結合這兩個矢量在一起。然後,根據第一個元素執行刪除操作,並同時刪除這兩個元素。
這可以使用Boost創建一個zip_iterator
,然後從兩個容器中並行迭代迭代器的tuple
。
首先通過一對zip_iterators
到std::remove_if
,並具有謂詞檢查第一vector
的元素的NaN
auto result = std::remove_if(boost::make_zip_iterator(boost::make_tuple(v1.begin(), v2.begin())),
boost::make_zip_iterator(boost::make_tuple(v1.end(), v2.end())),
[](boost::tuple<double, int> const& elem) {
return std::isnan(boost::get<0>(elem));
});
然後使用vector::erase
以除去不需要的元素。
v1.erase(boost::get<0>(result.get_iterator_tuple()), v1.end());
v2.erase(boost::get<1>(result.get_iterator_tuple()), v2.end());
以創建壓縮的迭代範圍所需的樣板可以通過使用boost::combine
和Boost.Range的版本的remove_if
被進一步減小。
auto result = boost::remove_if(boost::combine(v1, v2),
[](boost::tuple<double, int> const& elem) {
return std::isnan(boost::get<0>(elem));
});
這太棒了。謝謝!我選擇使用boost :: combine生成一個範圍,我可以在remove_if中調用begin()和end(),我認爲沒有真正的區別? – experquisite 2015-04-21 18:45:22
@experquisite這是一個很好的想法,相當多地清理了代碼。我補充說,答案。謝謝! – Praetorian 2015-05-07 00:57:38
如果它們是相關的值,其中最典型的方法是把數據的兩件在同一個對象,幷包含有這些對象的一個載體... – cdhowie 2014-10-30 16:28:20
像@cdhowie說,如果你知道他們有相同的長度和價值鏈接,你應該首先有一個'std :: vector>' –
PeterT
2014-10-30 16:29:13