类似矢量但已排序的数据类型
Posted
技术标签:
【中文标题】类似矢量但已排序的数据类型【英文标题】:A data type like vector but sorted 【发布时间】:2011-04-28 07:05:50 【问题描述】:是否有像向量或队列这样的数据类型可以轻松添加项目,但是当它们被添加时,它们会自动以正确的顺序插入?
如果您知道它是什么,是否有一种简单的方法可以从向量或队列中删除它,而无需实际搜索并找到它?
【问题讨论】:
“以正确的顺序插入”根据...? 如果它们是整数,排序。 Well why not just say what you plan on using it for instead of conjuring up hypothetical situations? 【参考方案1】:听起来你想要std::set
或std::multi_set
。
【讨论】:
【参考方案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);
【讨论】:
或者你可以用std::set
...(我现在感觉有点笨)
我喜欢两个人也认为我“有点愚蠢”的事实:D【参考方案3】:
听起来您正在寻找set
而不是向量。它将根据自然顺序(<
运算符)进行排序。按值删除元素调用erase
。
或者,您可以在向量上使用sort
对元素进行排序。如果您需要随机访问元素,那么您将需要这种方法;排序后的容器不提供随机访问。
要在排序向量中查找元素,您可以使用binary_search
。
【讨论】:
【参考方案4】:取决于你需要什么以及你为什么需要它。
不,在标准库中,没有“排序”向量或队列。如果您想仅使用标准库,您有 2 个选项:
在每次插入/删除时对容器(向量或队列)进行排序 实现您自己的插入/删除,通过实现insertion sort其他选项是使用 map 或 set,如果它们可以解决您的问题(因为我们不知道它是什么)
另一种选择是寻找一些 3rd 方库 - 我猜 boost 会有这样的容器,但我真的不知道。
“如果你知道它是什么,还有一种简单的方法可以从向量或队列中删除一个项目” - 你是什么意思?你有一个迭代器还是?还是它的索引?我会在您更新时编辑我的答案(:
【讨论】:
以上是关于类似矢量但已排序的数据类型的主要内容,如果未能解决你的问题,请参考以下文章