我想按大小对字符串向量进行反向排序,约束条件是如果有2个相等长度的字符串,我希望它们保留原始顺序。例如:对以下字符串集进行排序: -
aab
aac
aacghgh
aabghgh
应该产生: -
aacghgh
aabghgh
aab
aac
目前我正按以下方式进行排序: -
struct comp_functor {
bool operator()(const string& s1, const string& s2) {
return s1.size() > s2.size();
}
};
struct comp_functor c;
vector<string> vecs;
sort(vecs.begin(), vecs.end(), c);
有没有办法在重载方法中指定我想保留原始排序,如果它们具有相同的长度?如果没有,那么使用STL库解决这个问题的最佳方法是什么?
答案 0 :(得分:5)
我相信你正在寻找std::stable_sort
。
它保留了被认为相等的元素的顺序。
答案 1 :(得分:3)
如果您不希望等效元素更改订单,请不要使用{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeApplications #-}
module Main where
import Control.Lens
import Control.Monad.Reader
import Control.Monad.State
import Data.Diverse.Lens
import Data.Semigroup
foo :: (MonadReader r m, HasItem' Int r, HasItem' String r) => m (Int, String)
foo = do
i <- view (item' @Int) -- explicitly specify type
s <- view item' -- type can also be inferred
pure (i + 10, s <> "bar")
bar :: (MonadState s m, HasItem' Int s, HasItem' String s) => m ()
bar = do
(item' @Int) %= (+10) -- explicitly specify type
item' %= (<> "bar") -- type can also be inferred
pure ()
main :: IO ()
main = do
-- example of running ReaderT with multiple items
(i, s) <- runReaderT foo ((2 :: Int) ./ "foo" ./ nil)
putStrLn $ show i <> s -- prints out "12foobar"
-- example of running StateT with multiple items
is <- execStateT bar ((2 :: Int) ./ "foo" ./ nil)
putStrLn $ show (view (item @Int) is) <> (view (item @String) is) -- prints out "12foobar"
。请改用std::stable_sort - 它的存在完全是因为它具有不重新排序等效元素的属性。