gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:41 35 4
gpt4 key购买 nike

在下面的代码中。

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()) 可以?如果我们换成其他的,vector,string。这两种情况都有效。

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
}

最佳答案

这背后的原因是 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()));

关于c++ std::list 编译问题?与 list.end() 和 list.end() 有关 - 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900717/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com