STL中是否有分类容器?
我的意思是:我有一个std::vector<Foo>
,Foo
定制的类在哪里.我还有一个比较器,它将比较类的字段Foo
.
现在,我在我的代码中的某个地方:
std::sort( myvec.begin(), myvec.end(), comparator );
Run Code Online (Sandbox Code Playgroud)
它将根据我在比较器中定义的规则对矢量进行排序.
现在我想在Foo
该向量中插入一个class元素.如果可以的话,我想写一下:
mysortedvector.push_back( Foo() );
Run Code Online (Sandbox Code Playgroud)
会发生什么,矢量会根据比较器将这个新元素放到它的位置.
相反,现在我必须写:
myvec.push_back( Foo() );
std::sort( myvec.begin(), myvec.end(), comparator );
Run Code Online (Sandbox Code Playgroud)
这只是浪费时间,因为矢量已经排序,我需要的是适当地放置新元素.
现在,由于我的程序的性质,我不能使用,std::map<>
因为我没有键/值对,只是一个简单的向量.
如果我使用stl::list
,我再次需要在每次插入后调用sort.
所以我有一个向量,我希望元素始终排序.我应该如何将元素插入到该向量中,并在弹出它们时保持元素排序.std::lower_bound
然而,我调查了与我想要的相反的东西.
例如,这就是我想要的:当我弹出向量中的所有元素时,它应该是:1 2 3 4 5.这意味着向量必须将它们存储为5 4 3 2 1.如果使用下限,则向量将它们存储为1 2 3 4 5,并将其弹出为5 4 3 2 1.此外,将传入一个比较仿函数,以便该lower_bound
函数使用比较仿函数.有没有办法与比较仿函数相反?
我创建了一个名为Collect的方法,该方法将一堆值添加到向量中(如下所示)
void Median::Collect(double datum)
{
myVector.push_back(datum);
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一种方法来计算我在上述方法中的向量中收集的所有值的中位数。函数定义如下
/* Calculates the median of the data (datum) from the Collect method.
*/
double Median::Calculate() const
{
}
Run Code Online (Sandbox Code Playgroud)
所以我知道我首先需要对向量进行排序才能找到中位数。以下是我的尝试:
double Median::Calculate() const
{
std::sort(myVector.begin(), myVector.end());
double median;
if (myVector.size() % 2 == 0)
{// even
median = (myVector[myVector.size() / 2 - 1] + myVector[myVector.size() / 2]) / 2;
}
else
{// odd
median = myVector[myVector.size() / 2];
}
return median;
}
Run Code Online (Sandbox Code Playgroud)
但是我意识到这不是编译的,因为方法是const,所以对向量的值进行排序会改变向量,这在const函数中是不允许的。那么我应该为这种方法做什么?
我有两个相等长度的向量,我想根据其中一个向量中的条件从中删除元素.应对两者应用相同的删除操作,以使索引匹配.
我提出了一个使用的解决方案std::erase
,但它非常慢:
vector<myClass> a = ...;
vector<otherClass> b = ...;
assert(a.size() == b.size());
for(size_t i=0; i<a.size(); i++)
{
if( !a[i].alive() )
{
a.erase(a.begin() + i);
b.erase(b.begin() + i);
i--;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以更有效地执行此操作,最好使用stl算法?