簡體   English   中英

C ++ 11 STL獨有的功能,但反過來

[英]C++11 STL unique function, but in reverse

是否有一個像std::unique一樣運行的函數,但它采用自定義比較謂詞,並保留等效序列中的最后一個元素,而不是第一個? 如果C ++ 14或C ++ 17是一個選項,答案是肯定的; 但是我使用的是C ++ 11。

我開始使用一個大型重物的副本,按一個輕量級場分類。 某些對象具有相同的輕量級字段值,這是不可接受的。 我需要丟棄除了匹配光場的任何序列中的最后一個對象以外的所有對象。

目前我的代碼使用自定義二元謂詞和幫助器重對象調用equal_range ,然后倒回結束迭代器:

deque<Heavy> heavyDeque(...);

Light helperLight(...);
Heavy helperHeavy(helperLight, );

typedef deque<Heavy>:: iterator HevIt;

pair<HevIt, HevIt> deleteRange = equal_range(
    heavyDeque.begin(), heavyDeque.end(), helperHeavy,
    [](const Heavy & lhs, const Heavy & rhs) {
        return lhs.getLight() < rhs.getLight()})

//I have prior knowledge of at least one match
assert(deleteRange.first != deleteRange.second);
// back up; don't delete the last one
--(deleteRange.second);
heavyDeque.erase(deleteRange.first, deleteRange.second);

我不太高興不得不傳遞helperHeavy ,當我需要的內容是helperLight 我寧願我的代碼看起來像這樣:

pair<HevIt, HevIt> deleteRange = magical_range_search(
    heavyDeque.begin(), heavyDeque.end(),
    [helperLight](const Heavy & heavy) {
        return helperLight == heavy.getLight()})

請注意,我的虛構魔法函數采用一謂詞,而不是二元謂詞。

也許是這樣的事情?

template<typename BidirectionalIterator, typename UnaryPredicate>
pair<BidirectionalIterator,BidirectionalIterator>
magical_range_search(BidirectionalIterator begin,
                     BidirectionalIterator end, UnaryPredicate p)
{
  return {find_if(begin,end,p),
          find_if(make_reverse_iterator(end),make_reverse_iterator(begin),p)};
}

但是,當然,對於整個事情,您可以使用std::uniquereverse_iterator ,如注釋中所示:

heavyContainer.erase(heavyContainer.begin(),
                     unique(make_reverse_iterator(heavyContainer.end()),
                            make_reverse_iterator(heavyContainer.begin()),
                            [](Heavy const&lhs, Heavy const&rhs) {
                                return lhs.getLight() < rhs.getLight();
                            }).base());

這里reverse_iterator<>::base()返回unique()返回的reverse_iterator的底層原始迭代器。 unique()返回序列的新結尾時,反向操作返回序列的新開始。 新范圍是{new_begin, orignal_end} ,范圍{original_begin, new_begin}的元素必須是erase() d。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM