簡體   English   中英

直接將容器傳遞給函數與將容器作為引用傳遞給函數有什么區別?

[英]What is the difference between passing a container directly vs as a reference into a function?

為什么當作為參數傳遞時,集合似乎不是一對一復制的? 我想這與迭代器指向原始集而創建新的復制集這一事實有關。 所以 s.end() 將指向復制集的結束指針,而不是原始集。 但我不明白下面的非終止輸出。

為什么這會給出“-812375757575757575 ...”的輸出:

#include <iostream>
#include <set>

void f (std::set<int>::iterator itr, std::set<int> s) {
  if (itr != s.end()) {
    std::cout << *itr;
    ++itr;
    f(itr, s);
  }
}

int main() {
    std::set<int> s {1, 2, 3, 7, -8};
    f(s.begin(), s);
    return 0;
}

而這給出了“-81237”的輸出:

#include <iostream>
#include <set>

void f (std::set<int>::iterator itr, std::set<int>& s) {
  if (itr != s.end()) {
    std::cout << *itr;
    ++itr;
    f(itr, s);
  }
}

int main() {
    std::set<int> s {1, 2, 3, 7, -8};
    f(s.begin(), s);
    return 0;
}

第一個代碼表現出未定義的行為 每次調用f()時, set對象都會通過value傳遞,這意味着會生成一個副本 因此,您最終會比較不屬於同一set對象的迭代器,即 UB。

第二個代碼通過按引用傳遞原始set對象來修復該問題,因此不會創建任何副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM