为何无法用vector下标值为迭代器赋值?
为什么
it = &(testvectr[0])会报错? 嘿,这个问题的核心是迭代器和原生指针是完全不同的类型,咱们拆解来看:
错误原因
你声明的std::vector<int>::iterator it是一个迭代器对象,而&testvectr[0]返回的是int*——也就是原生的整数指针。C++是强类型语言,不会自动把原生指针转换成迭代器类型,所以编译器找不到匹配的=运算符,就抛出了那个错误。
为什么Method 1可行?
testvectr.begin()返回的类型正好是std::vector<int>::iterator,和你的it类型完全匹配,所以赋值毫无问题。
如果你想用下标相关的方式获取迭代器,该怎么做?
如果你想通过下标位置(比如第0个元素)来拿到对应的迭代器,有两种更安全的方式:
- 利用vector迭代器的随机访问特性,直接做加法:
it = testvectr.begin() + 0;(这里的0就是你想要的下标) - C++11及以后,可以用
std::next函数:it = std::next(testvectr.begin(), 0);
另外补充个小细节:testvectr[0]只有在vector非空的时候才是合法的(你这里push_back了元素,所以没问题),但如果vector是空的,testvectr[0]会直接触发越界行为;而testvectr.begin()在空vector时返回的是end(),是合法的迭代器(只是不能解引用),所以用begin()相关的方式会更安全。
内容的提问来源于stack exchange,提问作者Sankar Balasubramanian
相关产品推荐
相关产品推荐

