我有一个填充了数字3,7,10,5,12的列表。我想写一行代码,告诉我列表中的哪个元素没有排序(在这种情况下,它是第4个元素)。但是,我现在的代码告诉我第4个元素的值(8)。有没有办法可以改写这个来告诉我它是第4个元素而不是数字8?
以下是我现在的代码:
list<int>::iterator i;
if (!is_sorted(myList.begin(), myList.end())) {
i = is_sorted_until(myList.begin(), myList.end());
cout << *i << endl;
}
答案 0 :(得分:2)
我要说的第一件事是,如果你关心数字位置,你应该使用随机访问容器,例如std::vector
。那么你的工作很简单:
// calling is_sorted is a waste if you're about to call is_sorted_until
auto i = is_sorted_until(my_vector.begin(), my_vector.end());
if (i != my_vector.end())
cout << (i - my_vector.begin());
如果您必须使用列表,并且仍然需要该位置,那么您应该编写自己的算法来提供此信息。它真的不应该那么难,它只是一个for循环比较每个元素和它之前的元素。如果你发现一个比它的比较小的那个,你就找到了你的元素。只要保持一个整数计数,你就会好。
答案 1 :(得分:1)
显而易见的方法是简单地搜索一个小于之前元素的元素。
int position = 1;
auto prev = myList.begin(), pos=std::next(prev, 1);
while (*pos != myList.end() && *prev < *pos) {
++position;
++prev;
++pos;
}
你可以使用标准算法,但对于这种情况,它们似乎有些笨拙。
答案 2 :(得分:-1)
这有帮助吗?
std::is_sorted_until()
来自http://www.cplusplus.com/reference/algorithm/is_sorted_until/:
在范围内查找第一个未排序的元素 返回范围[first,last]中第一个元素的迭代器,它不遵循升序。
返回的first和迭代器之间的范围已经过排序。
如果整个范围已排序,则该函数最后返回。
使用运算符&lt;来比较元素。对于第一个版本,和comp为第二个版本。