【发布时间】:2013-03-28 10:26:25
【问题描述】:
所有,
这个问题是this one 的延续。 我认为 STL 错过了这个功能,但它只是我的恕我直言。
现在,问题来了。
考虑以下代码:
class Foo
{
public:
Foo();
int paramA, paramB;
std::string name;
};
struct Sorter
{
bool operator()(const Foo &foo1, const Foo &foo2) const
{
switch( paramSorter )
{
case 1:
return foo1.paramA < foo2.paramA;
case 2:
return foo1.paramB < foo2.paramB;
default:
return foo1.name < foo2.name;
}
}
int paramSorter;
};
int main()
{
std::vector<Foo> foo;
Sorter sorter;
sorter.paramSorter = 0;
// fill the vector
std::sort( foo.begin(), foo.end(), sorter );
}
在任何给定的时刻,向量都可以重新排序。 该类还具有在 sorter 结构中使用的 getter 方法。
在向量中插入新元素最有效的方法是什么?
我的情况是:
我有一个网格(电子表格),它使用一个类的排序向量。在任何给定时间,向量都可以重新排序,网格将相应地显示排序后的数据。
现在我需要在向量/网格中插入一个新元素。 我可以插入,然后重新排序,然后重新显示整个网格,但这非常低效,尤其是对于大网格。
任何帮助将不胜感激。
【问题讨论】:
-
我认为你应该使用 set,如果你没有重复的话。或者 std::list 否则。 Vector 似乎不适合需要经常排序的东西。
-
std::set基于红黑树,重新插入复杂度为 O(logn)。您可能需要考虑这个insert into sorted array问题的相关树结构,例如 rb-tree、avl-tree 等。 -
@stardust_ 排序很好,我认为主要缺点是插入会导致元素移位,尤其是导致内存重新分配时。好的选择是出队 - 因为它整合了向量(搜索)和列表(插入)的所有良好特征,所有这些都取决于数据属性和它的操作。
标签: c++ sorting vector stl insertion-sort