一种数据类型,如矢量但已排序

时间:2011-04-28 07:05:51

标签: c++ sorting vector types

是否有像向量或队列这样的数据类型,您可以轻松添加项目,但是当它们被添加时,它们会按正确的顺序自动插入?

还有一种简单的方法可以从矢量或队列中删除项目,如果你知道它是什么,而不必实际搜索并找到它?

4 个答案:

答案 0 :(得分:2)

我不知道这样的容器。

存在

std::sort,您可以在其中指定排序功能,但实际上直接在右侧位置插入项目通常更有效。

如果你总是这样做,你必须要解决的唯一“问题”是将一个项目添加到已排序的列表中,这可以在最差的线性时间内完成。

请注意std::vector<T>::insert()将迭代器作为参数,以指示插入的位置。您可能希望编写一个返回此类迭代器的findPosition()方法。然后,编写sorted_insert()方法很简单,就像:

std::vector<int>::iterator findPosition(int v);
void sorted_insert(std::vector<int>& vec, int v) { vec.insert(findPosition(v), v); }

void foo()
{
  std::vector<int> vec;
  sorted_insert(vec, 4);
}

答案 1 :(得分:2)

听起来像是std::setstd::multi_set

答案 2 :(得分:1)

听起来你正在寻找set而不是矢量。它将根据自然顺序(<运算符)进行排序。要按值删除元素,请调用erase

或者,您可以在向量上使用sort来对元素进行排序。如果您需要随机访问元素,那么您将需要这种方法;已排序的容器不提供随机访问。

要在已排序的矢量中查找元素,您可以使用binary_search

答案 3 :(得分:0)

取决于您的需求以及为什么需要它。

不,在标准的lib中,没有“已排序”的向量或队列。如果您想使用 标准库,则有2个选项:

  • 在每次插入/删除时对容器(矢量或队列)进行排序
  • 通过实施insertion sort
  • 实现您自己的插入/删除

其他选项是使用地图或集合,如果它们可以解决您的问题(因为我们不知道它是什么)

另一个选择是寻找一些第三方库 - 我想boost会有这样的容器,但我真的不知道。

“还有一种简单的方法可以从矢量或队列中删除项目,如果你知道它是什么” - 你是什么意思?你有一个迭代器或?还是它的索引?我会在你更新时编辑我的答案(: