在下面的代码中。
int main() {
list<int> m_list;
m_list.push_back(1);
list<int>::iterator it1 = (--m_list.end()); // it works, *it1 return 1;
list<int>::iterator it2 = (m_list.end() - 1); // compile issue?
}
有人解释为什么列表(m_list.end()-1)中存在编译问题?为什么(--m_list.end())可以呢? 如果我们换成其他,矢量,字符串。两种情况都有效。
int main() {
vector<int> m_vector;
m_vector.push_back(1);
vector<int>::iterator it1 = (--m_vector.end()); // both work
vector<int>::iterator it2 = (m_vector.end() - 1); // both work
}
答案 0 :(得分:5)
其背后的原因是list :: end()返回一个不支持该操作的双向迭代器。
来源:
http://www.cplusplus.com/reference/iterator/BidirectionalIterator/
另一方面,vector :: end()和string :: end()返回支持这种操作的随机访问迭代器。
http://www.cplusplus.com/reference/iterator/RandomAccessIterator/
编辑:
如果您确实要完成任务,请使用std::prev()
函数
list<int>::iterator it2 = (std::prev(m_list.end(), 1));
Pete Becker建议,“ std :: prev的第二个参数的默认值为1”
因此,您也可以这样做:
list<int>::iterator it2 = (std::prev(m_list.end()));
答案 1 :(得分:2)
有人解释为什么列表(m_list.end()-1)中存在编译问题吗?
因为列表迭代器不支持随机访问。仅保证随机访问迭代器支持operator-
(和operator+
)。
为什么(--m_list.end())还可以?
因为双向迭代器支持operator--
(和operator++
)。列表迭代器是双向的。
如果我们换成其他,矢量,字符串。两种情况都有效。
向量和字符串都有随机访问迭代器。