查找未在列表中排序的元素

时间:2014-05-02 04:19:44

标签: c++ list

我有一个填充了数字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;
         }

3 个答案:

答案 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为第二个版本。