簡體   English   中英

為什么 C++ 標准容器迭代器會忽略其底層容器的一些模板參數?

[英]Why do C++ std container iterators ignore some template parameters of their underlying container?

這是一個具體的例子。 在下面的代碼中,我預計會出現編譯錯誤,例如“無法將 std::map< int, int, cmp >::iterator 類型的值賦給 std::map< int, int >::iterator 類型的變量” . 但是,我能夠毫無問題地編譯代碼(g++ C++20 Wall)。 感謝幫助。

#include <map>

struct cmp {
    bool operator()(const int a, const int b) const { return a > b; }
};

int main(int argc, char *argv[]) {

    std::map<int, int> m1;
    std::map<int, int>::iterator m1_it = m1.begin();

    std::map<int, int, cmp> m2;
    std::map<int, int, cmp>::iterator m2_it = m2.begin();

    // Why do these work?
    m1_it = m2.begin();
    m2_it = m1.begin();

    return 0;
}

標准對迭代器類型幾乎沒有限制,只是強加了一些行為。

尤其是:

  • 他們不必在namespace std中。 所以T*可能是std::vector<T>的有效迭代器。

  • 它們不必具有與其容器相同的模板參數。 對於上面的示例, T*可能是任何Allocatorstd::vector<T, Allocator>的迭代器。

事實上,它的類型安全性較低,模板參數越少,實例化就越少(編譯速度越快,生成的類似代碼越少……)。

請注意,您的代碼可能無法針對將所有模板參數用於其迭代器的編譯器/庫進行編譯。

一個實際的原因是這可能會導致更小的可執行文件。 你的兩個 map 類型可以共享一個迭代器類型,所以所有的迭代器函數也是共享的。

暫無
暫無

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

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