C++ 迭代器的大小与其容器的大小是否正相关?
例如,C++ 迭代器的大小与其容器的大小是否正相关?,c++,C++,例如,std::vector::iterator是否大于std::vector::iterator?标准库迭代器类型的定义(以及它们的大小)是实现定义的。sizeof(vector::iterator)可能取决于T。然而,在实践中,情况往往并非如此
std::vector::iterator
是否大于std::vector::iterator
?标准库迭代器类型的定义(以及它们的大小)是实现定义的。sizeof(vector::iterator)
可能取决于T
。然而,在实践中,情况往往并非如此<实际上,迭代器只是T*
上的包装器。类似地,list::iterator
通常是指向列表节点的指针上的包装器。某些类型(如deques)可能具有更复杂的迭代器,但其大小仍不太可能取决于模板参数
(编辑:对于
std::array
迭代器是一个指针。)标准库迭代器类型的定义(以及它们的大小)是实现定义的。sizeof(vector::iterator)
可能取决于T
。然而,在实践中,情况往往并非如此<实际上,迭代器只是T*
上的包装器。类似地,list::iterator
通常是指向列表节点的指针上的包装器。某些类型(如deques)可能具有更复杂的迭代器,但其大小仍不太可能取决于模板参数
(编辑:对于
std::array
来说,迭代器是一个指针。)因为它完全是实现定义的,所以您不妨做一个快速测试:
#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <iterator>
int main() {
std::cout << "vector<vector<int>>::iterator: " << sizeof(std::vector<std::vector<int>>::iterator) << "\n";
std::cout << "vector<int>::iterator: " << sizeof(std::vector<int>::iterator) << "\n";
std::cout << "vector<bool>:iterator: " << sizeof(std::vector<bool>::iterator) << "\n";
std::cout << "deque<int>::iterator: " << sizeof(std::deque<int>::iterator) << "\n";
std::cout << "list<int>::iterator: " << sizeof(std::list<int>::iterator) << "\n";
std::cout << "list<list<int>>::iterator: " << sizeof(std::list<std::list<int>>::iterator) << "\n";
std::cout << "deque<list<int>>::iterator: " << sizeof(std::deque<std::list<int>>::iterator) << "\n";
}
#包括
#包括
#包括
#包括
#包括
int main(){
std::cout因为它完全是实现定义的,所以您不妨做一个快速测试:
#include <iostream>
#include <vector>
#include <deque>
#include <list>
#include <iterator>
int main() {
std::cout << "vector<vector<int>>::iterator: " << sizeof(std::vector<std::vector<int>>::iterator) << "\n";
std::cout << "vector<int>::iterator: " << sizeof(std::vector<int>::iterator) << "\n";
std::cout << "vector<bool>:iterator: " << sizeof(std::vector<bool>::iterator) << "\n";
std::cout << "deque<int>::iterator: " << sizeof(std::deque<int>::iterator) << "\n";
std::cout << "list<int>::iterator: " << sizeof(std::list<int>::iterator) << "\n";
std::cout << "list<list<int>>::iterator: " << sizeof(std::list<std::list<int>>::iterator) << "\n";
std::cout << "deque<list<int>>::iterator: " << sizeof(std::deque<std::list<int>>::iterator) << "\n";
}
#包括
#包括
#包括
#包括
#包括
int main(){
std::coutstd::vector::iterator
很可能是一个不同于正常的大小,因为std::vector
@NeilKirk哦,是的,我忘了。在VS2013的调试模式下,vector
/列表::iterator
的大小有3个指针那么大,“只是T*
上的包装器”断言对于“发布”版本来说是正确的,但是,…std::vector::iterator
可能会比正常的大小不同,因为std::vector
@NeilKirk哦,是的,我忘记了。在VS2013的调试模式下,vector
/列表::iterator
的大小有3个指针那么大;而“只需包装T*
”断言适用于“发布”"但是构建…你说的大小是什么意思?std::vector
占用的空间不一定比std::vector
占用的空间大@NeilKirk是的,我指的是他们占用的空间。可以正式地谈论sizeof
操作符或者你说的大小是什么意思?std::vector
占用的空间s不一定比std::vector
@NeilKirk占用的空间多。是的,我的意思是他们占用的空间。可以是正式的,谈论sizeof
运算符64位模式?可能有助于将sizeof(void*)
添加到列表中。64位模式?可能有助于将sizeof(void*)
添加到列表中。
vector<vector<int>>::iterator: 8
vector<int>::iterator: 8
vector<bool>:iterator: 16
deque<int>::iterator: 32
list<int>::iterator: 8
list<list<int>>::iterator: 8
deque<list<int>>::iterator: 32