[英]C++ erase() in a function
預期在“幫助器”功能中輸出設置的元素時,元素“ 2”已被刪除。 但是實際結果仍然是“ 1 2 3 4 5”。
但是,集合的大小為4。
我想知道潛在的問題。
#include <iostream>
#include <set>
using namespace std;
void helper(set<int> myset, set<int>::iterator it) {
myset.erase(it);
cout << "size:" << myset.size() << endl;
for(auto el : myset)
cout << el << " ";
}
int main(int argc, const char * argv[]) {
set<int> myset = {1,2,3,4,5};
auto it = myset.begin();
it++;
helper(myset,it);
}
在helper
中, it
是main
myset
的迭代器。 但myset
在helper
是副本 myset
在main
。 這意味着helper
函數中的it
不會引用您在該函數中使用的myset
中的元素,因此它是未定義的行為。 您將需要使helper
的myset
成為參考。 嘗試:
void helper(set<int> & myset, set<int>::iterator it)
編輯:這也解決了您可能沒有注意到的另一個問題。 以前,按值獲取myset
時,您只是在修改本地副本。 您可以(嘗試)從副本中刪除一個元素,然后打印該元素,但這不會影響傳遞給main
的函數的原始myset
。 通過引用,在helper
函數中對myset
更改實際上將更改原始的myset
。
您正在按值將set
傳遞給輔助函數。 因此,迭代器引用的是原始集合,而不是函數中創建的副本。
即使迭代器仍然有效副本,改變副本是不是你想要的。 您要更改原件。
通過引用將該集合傳遞給您的助手,以使其按照自己的意願進行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.