2017-04-07 44 views
2

我正在嘗試迭代deque以排除最後一個條目。理想情況下我會避免計數和比較長,所以我嘗試C++ deque迭代到倒數第二個元素

auto it_end = dq.rbegin(); it_end++; 
    for (auto it = dq.begin(); it !=it_end;) { 
     if (cond()) { 
      it = dq.erase(it); 
     } else { 
      it++; 
     } 
    } 

但是編譯器會抱怨沒有匹配的操作數,這似乎可以理解的,因爲我有一個反向迭代器和一個普通的迭代器。在避免計數的最後一個元素之前有沒有優雅的方法停止?像,抵消? 我也嘗試過使用回來,但是原來這是一個不是迭代器的引用,所以!=也不高興。

回答

5

您可以使用dq.end() - 1在結束之前得到一個。

您也可以使用std::removestd::remove_if刪除您想要的項目,而不是自己做這項工作。請注意,這基本上類似於分區操作 - 它會返回一個迭代器,並且您希望保留的所有內容都是從該範圍的起始位置開始到該迭代器。您想要刪除的所有內容都在該迭代器之後,直到您作爲輸入提供的範圍的末尾。

在這種情況下,你可以這樣做一般順序的東西:

std::deque<int> vals { 1, 2, 3, 4, 5, 6, 7, 8}; 

// get an iterator one before the end of `vals` 
auto end = vals.end()-1; 

// remove the even items in the range (so all except `8`) 
auto pos = std::remove_if(vals.begin(), end, 
    [](int v){ return v %2 == 0;} 
); 

// erase the items we just "removed" 
vals.erase(pos, end); 

// show the result 
for (v : vals) 
    std::cout << v << ", "; 
+0

不錯。這與解決問題一樣簡單。完美 – chrise

0

如何:

deque dq; 
//fill it 
for(int i = 0; i < dq.size() - 1; i++) //notice the "-1" to avoid reaching the last element 
{ 
    if (cond()) 
    { 
     dq.erase(dq.begin()+i); 
     i--; 
    } 
} 

您可以通過訪問operator[]元素deque,所以dq[i]是雙端隊列的元素數量i

1

std::deque::erase

所有迭代器和引用都無效,除非刪除元素是在最後或容器的開始,在這種情況下,只有迭代器和對擦除元素的引用纔會失效。

這意味着你不能使用迭代器遍歷一個雙轉移並刪除一些元素。請使用std::remove_if並使用std::deque::erase

(未經測試,但你會得到一個想法)

std::deque<T> dq = /* ... */; 
auto from = std::remove_if(dq.begin(), std::prev(dq.end()), 
    [](decltype(dq)::const_reference, decltype(dq)::const_reference){ return cond(); } 
); 
dq.erase(from, std::prev(dq.end())); 
+0

這就是爲什麼我有它= dq.erase(它)從文檔:一個迭代器指向元素的新位置,後面跟着最後一個元素被函數調用擦除。如果操作刪除了序列中的最後一個元素,則這是容器末端。 – chrise

0

使用it_end.base()

#include <iostream> 
#include <deque> 
#include <iterator> 

using namespace std; 

int main() 
{ 
    deque<int> dq = { 0, 1, 2, 3,4, 5 }; 
    auto it_end = dq.rbegin(); it_end++; 

    for (auto it = dq.begin(); it != it_end.base(); ++it) { 
     cout << *it << " "; 
    } 

    cout << "\n"; 
    return 0; 
} 

輸出:

0 1 2 3 4 

https://stackoverflow.com/a/10373912/12711一些細節上如何base()函數適用於反向迭代器。