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 #
- 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
相似問題
- c++:在针對C ++ 03時,將std :: basic_string <t>用作连續緩衝區是否合理?c++stringwinapistlc++032021-01-11 06:27
- c++:我應该將整个物件還是指向物件的指標儲存在容器中?c++stlpointers2021-01-10 05:58
- c++:如何在dll介面或ABI中使用標準庫(STL)類?c++dllc++11stlstd2021-01-09 23:26
- C ++異常:丟擲std :: stringc++exceptionstl2021-01-09 11:23
- c++:boost是否具有比STL更簡單的set操作資料型別?c++booststlset2021-01-09 09:27
看到編譯的輸出,實際上是
std::remove
不会从容器中删除專案.从這裏引用也就是說,
std::remove
仅与一對迭代器一起使用,並且對實際包含專案的容器一無所知.實際上,對於std::remove
来說是不可能的 知道底層容器,因為不可能从一對迭代器去發現迭代器所屬的容器.太棒了 並没有真正删除專案,std::remove
.實際上从容器中删除專案的唯一方法是在该容器上呼叫成員函式。因此,如果您要删除專案,請使用"删除删除成語":
擦除删除习惯如此普遍和有用,以至於
v.erase(std::remove(v.begin(), v.end(), 10), v.end());
添加了另一个名為std::list
的成員函式 产生与list::remove
相同的效果 成語。這意味着,您不需要使用
std::list<int> l; //... l.remove(10); //it "actually" removes all elements with value 10!
与erase-remove
一起工作時的成語 .您可以直接呼叫其成員函式std::list