2011-06-09 71 views
0

我們試圖使用std :: deque擦除成員函數。 std :: deque erase(iterator)成員函數的返回值是一個隨機訪問迭代器,它指向在函數調用擦除的最後一個元素後面的元素的新位置,如果操作刪除序列中的最後一個元素。是否可以有效檢查STL std :: deque擦除是否成功?

我們想知道是否可以有效地檢查STL std :: deque擦除是否成功。謝謝。我們的代碼摘錄如下:

typedef std::multimap<char *,Range>::const_iterator I; 
std::pair<I,I> b = mmultimap.equal_range(TmpPrevMapPtr); 

for (I i=b.first; i != b.second; ++i){ 
    std::deque<Range>::iterator iter; 
    std::deque<Range>::iterator it; 
    iter = std::lower_bound(ranges_type.begin(),ranges_type.end(),i->second); 
    if (iter != ranges_type.end() && !(i->second < *iter)){ 
     it = ranges_type.erase(iter); 
    } 
} 
+1

爲什麼這個標籤'linux'和'visual-C++'?這似乎是一個奇怪的組合。此外,你可能想要修復你的代碼塊。 – Sven 2011-06-09 15:20:17

+0

Sven,我們試圖用於我們的原型推理的代碼必須在Linux和Windows Visual C++上工作。謝謝。 – Frank 2011-06-09 15:25:55

+0

然後'C++'只要 – rubenvb 2011-06-09 15:58:43

回答

2

檢查出列的大小是否減少了您刪除的元素的數量。
至於對性能的關注,時間複雜度爲dequeue::sizeO(1)

#include <iostream> 
#include <deque> 
using namespace std; 

int main() 
{ 
    unsigned int i; 
    deque<unsigned int> mydeque; 

    // set some values (from 1 to 10) 
    for (i=1; i<=10; i++) mydeque.push_back(i); 

    cout << "\nmydeque contains:"<<mydeque.size(); 

    // erase the 6th element 
    mydeque.erase (mydeque.begin()+5); 

    // erase the first 3 elements: 
    mydeque.erase (mydeque.begin(),mydeque.begin()+3); 

    //Total Elements erased = 4 

    cout << "\nNow mydeque contains:"<<mydeque.size(); 

    return 0; 
} 
+0

謝謝你的回答。需要多長時間才能找到deque 0(1)或0(N)的大小?謝謝。 – Frank 2011-06-09 15:30:19

+0

感謝您對代碼示例的回答,並驗證std :: deque :: size是0(1)操作。我們會盡力回答您的問題,謝謝。 – Frank 2011-06-09 15:40:18

+0

我剛接受你的回答。謝謝 – Frank 2011-06-09 17:11:15

3

std::deque::erase總是成功(當然,除非它得到一個無效的迭代器,在這種情況下,結果是不確定的)。

+0

謝謝你的回答。我們想知道是否有效地確定std :: deque :: erase是否得到無效的迭代器?謝謝。 – Frank 2011-06-09 15:28:06

+0

不,只要繼續檢查'end()',並確保在操作失效後不要重複使用迭代器。對於'std :: deque',規則是*如果擦除在序列的開始或結束時執行,則只有迭代器和對擦除元素的引用無效。如果刪除發生在雙端隊列的中間,則所有迭代器和引用都將失效。* – 2011-06-09 15:30:24

+0

謝謝您的回覆。如果我們刪除了雙端隊列的最後一個元素,那麼stq :: deque :: erase(iterator)是否可能返回end()呢?如果我們檢查end(),我們可以忽略std :: deque :: erase擦除deque的最後一個元素的情況。謝謝。 – Frank 2011-06-09 15:34:53

1

如果擦除成功的雙端隊列會短於它。或者,將你的代碼包裝在一個函數中(你應該在任何情況下都應該這樣做),並讓函數返回是否發生了擦除。

+0

@Neil Butterworth,謝謝你的回答。你知道std :: deque :: size是一個BIG-O(1)還是BIG-o(N)操作?謝謝。 – Frank 2011-06-09 15:37:17

+0

@Frank我不認爲該標準指定了deque的size()所需的複雜度。 – 2011-06-09 15:46:10

+0

@尼爾巴特沃斯。感謝您的回覆。我們是否應該查看Microsoft STL和GNU STL實現代碼以找出deque中size()的時間複雜性。或者,在Microsoft STL或GNU LINUX STL中是否有另一個地方可以找到std :: deque :: size()的時間複雜度?謝謝。 – Frank 2011-06-09 16:02:35