首頁>Program>source
int main()
{
        const int SIZE = 10;
        int a[SIZE] = {10, 2, 35, 5, 10, 26, 67, 2, 5, 10};
        std::ostream_iterator< int > output(cout, " ");
        std::vector< int > v(a, a + SIZE);
        std::vector< int >::iterator newLastElement;
        cout << "contents of the vector: ";
        std::copy(v.begin(), v.end(), output);
        newLastElement = std::remove(v.begin(), v.end(), 10);
        cout << "\ncontents of the vector after remove: ";
        //std::copy(v.begin(), newLastElement, output); 
                         //this gives the correct result : 2 35 5 26 67 2 5
        std::copy(v.begin(), v.end(), output);
          //this gives a 10 which was supposed to be removed : 2 35 5 26 67 2 5 2 5 10
        cout << endl;
        return 0;
}

陣列a中有三个10。

為什麼我们用remove函式删除所有的10後,陣列v為什麼包含10。

您也可以在此處

最新回復
  • 5月前
    1 #

    看到編譯的輸出,實際上是 std::remove 不会从容器中删除專案.从這裏引用

    Remove removes from the range [first, last) 等於 value的所有元素 .也就是說,remove返迴一个迭代器 new_last 這樣範圍 [first, new_last) 不包含等於 value的元素 .[new_last, last)範圍內的迭代器 都是 still dereferenceable ,但它们指向的元素是 unspecified 保持稳定,這意味着不等於value的元素的相對順序不變。

    也就是說, std::remove 仅与一對迭代器一起使用,並且對實際包含專案的容器一無所知.實際上,對於 std::remove来說是不可能的 知道底層容器,因為不可能从一對迭代器去發現迭代器所屬的容器.太棒了 並没有真正删除專案, std::remove .實際上从容器中删除專案的唯一方法是在该容器上呼叫成員函式。

    因此,如果您要删除專案,請使用"删除删除成語":

    simply because it cannot
    

    擦除删除习惯如此普遍和有用,以至於 v.erase(std::remove(v.begin(), v.end(), 10), v.end()); 添加了另一个名為 std::list的成員函式 产生与 list::remove相同的效果 成語。

    erase-remove
    

    這意味着,您不需要使用 std::list<int> l; //... l.remove(10); //it "actually" removes all elements with value 10!erase-remove一起工作時的成語 .您可以直接呼叫其成員函式 std::list

  • 5月前
    2 #

    原因是STL演算法不会修改序列的大小. list::remove ,而不是實際擦除專案,而是移動它们並將迭代器返迴到"新"端.然後可以將该迭代器傳遞给 remove 容器的成員函式以實際執行删除操作:

    erase
    

    順便說一句,這就是所謂的"删除惯用語"。

    編輯:我不正確.請參阅評論和Nawaz的答案。

  • 5月前
    3 #

    因為 v.erase(std::remove(v.begin(), v.end(), 10), v.end()); 實際上並没有收縮容器,它只是將所有元素向下移動以填充"已移除"元素所使用的位置.例如,如果您有一个序列 std::remove 並使用 1 2 3 4 5 删除值 std::remove ,您的序列將看起来像 2 .如果然後删除值 1 3 4 5 5 ,您会得到 4 .绝對不会告诉序列更短。

    1 3 5 5 5

  • netbeans 7:在哪裏可以下載JavaFX 22源代碼?
  • 如何在MATLAB中將圖像划分為塊?