C ++ std :: list编译问题?与list.end()和list.end()有关-1

时间:2018-12-23 02:16:52

标签: c++ list

在下面的代码中。

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 
}

2 个答案:

答案 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++)。列表迭代器是双向的。

  

如果我们换成其他,矢量,字符串。两种情况都有效。

向量和字符串都有随机访问迭代器。