为何vector::begin()迭代器无法直接输出而array::begin()可以?
关于vector和array迭代器输出内存地址的问题
问题代码与现象
vector<int>::iterator first_vector = viktor.begin(); array<int,14> j = {7,3,4}; array<int,14>::iterator first_array= j.begin(); cout<<(first_vector); // Error cout<<(first_array); // Output :: 0xeb1ebff940
尝试输出迭代器指向的内存地址时,array的迭代器能正常输出地址,但vector的迭代器触发错误:
error: no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream
'} and 'std::vector ::iterator')
用&取vector迭代器得到的是迭代器自身的地址,而非指向的元素地址,疑惑其中的关键点。
核心原因与解决方法
- array迭代器的本质:
std::array的迭代器在绝大多数标准库实现中是原生指针的别名(比如直接typedef成int*),而C++标准为原生指针重载了operator<<,所以可以直接用cout输出其指向的地址。 - vector迭代器的本质:
std::vector的迭代器是封装后的类类型(不是原生指针),标准库没有为这个类重载operator<<,因此直接打印会报错。
要输出vector迭代器指向的内存地址,需将其转换为原生指针:
// 正确获取vector迭代器指向的内存地址 cout << &*first_vector << endl;
解释:*first_vector解引用迭代器得到指向的元素,&取该元素的地址,这就是迭代器实际指向的内存地址。
注意事项
如果vector为空,viktor.begin()等于viktor.end(),此时解引用迭代器属于未定义行为,必须确保迭代器指向有效元素后再使用&*操作。
内容的提问来源于stack exchange,提问作者Abdulrahman Nasser
相关产品推荐
相关产品推荐

