STL排序保留原始订单

时间:2018-04-14 12:18:15

标签: c++ c++11 stl

我想按大小对字符串向量进行反向排序,约束条件是如果有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库解决这个问题的最佳方法是什么?

2 个答案:

答案 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 - 它的存在完全是因为它具有不重新排序等效元素的属性。