繁体   English   中英

迭代器的减少和减少之间的区别

[英]The difference between reduce and decrease in iterator

像这样的代码:

list<const char *> lst_city = {"NewYork", "Tokoyo", "ShenZhen"};
vector<string> vs_city;
vs_city.assign(lst_city.cbegin(), --lst_city.cend()); 

是的。但是,如果我这样做,将是错误的:

vs_city.assign(lst_city.cbegin(), lst_city.cend() - 1);

有什么区别-和-1,我不太清楚。 如果它是一个向量,那也将是一件好事,那仅仅是因为列表的双边关系吗?

std::vector的迭代器是随机访问迭代器 -可以使用+-将它们偏移任意偏移,而1只是特定偏移。

std::list的迭代器无法做到:它们只是双向迭代器 ,一次只能递增( ++ )和递减( -- )一个元素。

您可以通过std::advance使用这两种方法(取决于迭代器的功能)来编写移动任意迭代器的代码。

在您的情况下,即非常常见的单个元素移位,可以使用std::prevstd::next

链表不能在恒定时间内跳转到任意元素。 要在索引处查找元素,必须逐个遵循节点之间的链接。

由于任意跳转不是O(1)操作,因此将其作为列表迭代器的原始操作提供会产生误导,并导致程序员意外地编写效率很低的算法。 因此, it - n的操作it - n不存在。

编译器无法区分it - 1和n的其他值,因此也禁止此操作。 您将剩下使用减量运算符。

另一方面,向量迭代器可以在恒定时间内任意跳动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM