类似矢量但已排序的数据类型

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::setstd::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 而不是向量。它将根据自然顺序(&lt; 运算符)进行排序。按值删除元素调用erase

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

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

【讨论】:

【参考方案4】:

取决于你需要什么以及你为什么需要它。

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

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

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

另一种选择是寻找一些 3rd 方库 - 我猜 boost 会有这样的容器,但我真的不知道。

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

【讨论】:

以上是关于类似矢量但已排序的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

GlobalMapper精品教程016:按照指定字段批量生成不同用地类型的矢量图层

核心数据:根据实体类型对抽象实体的结果进行排序

Redis的数据类型

python数据分析Numpy

PIE-Basic 矢量创建

访问 Visual Studio ImageWatch 插件的 .natvis 文件中的矢量基础数据