【问题标题】:one line assert to test if STL container is sorted一行断言测试 STL 容器是否已排序
【发布时间】:2011-02-26 15:48:46
【问题描述】:

如果 STL 容器已排序,有没有办法编写一个返回 true 的单行条件?有问题的容器是 std::vector

我打算在断言中使用它

【问题讨论】:

  • 你不应该把这种东西放在断言中。断言适用于永远不可能发生的事情。抛出异常很可能更合适。如果传递一个未排序的向量违反了方法或对象操作合同,那么它应该抛出不断言。异常比断言有很大的优势,在大多数情况下应该优先使用。
  • @radman:如果它们永远不可能发生,你为什么要断言它们?您需要定义上下文!例如:断言类不变量,但在违反接口前置条件或后置条件时抛出。
  • @ltjax 你的权利有点简洁。断言主要是为了捕捉程序员的错误,异常是针对错误的输入或不可避免的运行时问题。我认为类不变量是正确使用断言的一个很好的例子。从根本上说,断言为跟随它们的代码提供了保证,从而最大限度地减少侵入性错误处理,并尽早和大声地发现程序员错误。
  • 这对我来说似乎是一个很好的断言。如果您想编写类似 binary_search 的东西,那么这需要一个排序容器才能工作。在那里有一个断言来检查它是否真的是排序的,这似乎是断言的用途。虽然当然这是一个非常昂贵的测试......

标签: c++ arrays stl assert


【解决方案1】:

adjacent_find 与更少或更大的函子结合使用。

限制:
您应该知道容器是按升序还是降序排序的。

如果vector应该按升序排序:

//Checks the first element where adjacent value where elem > nextElem
//returns end if the vector is sorted!
//Complexity is O(n)
vector<int>::iterator pos =  std::adjacent_find (aVec.begin(), aVec.end(),   // range
                                     std::greater<int>());               


if (pos == aVec.end()) 
{
    std::cout<<" sorted"<<endl;
}
else
{
    std::cout<<"Not sorted"<<endl;
}

【讨论】:

  • 众所周知的技巧,虽然不是很明显。幸运的是,C++0x 为此引入了is_sorted 函数:)
【解决方案2】:

您可以使用std::is_sorted(vec.begin(),vec.end()) 来测试它是否已排序。但请注意,这是 O(n)。

【讨论】:

  • is_sorted 不是 C++ 标准库的一部分。
  • 它符合 C++0x 标准 - 并随 VC++ 2010 提供
  • @corvuscorax,是的,它在 C++0x 中,但不幸的是它只是草稿。 I wouldn't use it in a production code.
  • @KirillV.Lyadvinsky 只是现在它正式成为 STL 的一部分,使这个答案成为最好的答案。 :-)
【解决方案3】:

这取决于您要使用的 STL 数据类型。

如果键重载了比较运算符,则映射已经按键排序。你很高兴去这里。

列表要求您显式调用排序函数。您需要跟踪您是否已对其进行排序。

希望这会有所帮助。

【讨论】:

  • 您不能在 std::list 容器上使用 std::sort()
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多