使用特殊值对C ++中的字符串向量进行排序,以放在最后

时间:2018-05-17 18:47:05

标签: c++ string sorting vector

我试图制作一个用这个标准对字符串向量进行排序的函数:

所有字符串=" NULL"必须到向量的末尾并从那里减少。其余的字符串必须保持秩序。

例如:

{"Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"}

输出应为:

{"Potato","Charmander","Spaghetti","NULL","NULL","NULL"}

我试过这个,但它不太有效:

bool comp(string i, string j){
    if(i=="NULL"){return i>j;}
     if (j=="NULL") {return i<j;}

提前致谢

3 个答案:

答案 0 :(得分:1)

你可以做以下两件事之一:

  1. 首先处理&#34; NULL&#34; s,然后按照我们经常做的天真方式对其他字符串进行排序
  2. 使用您定义的更复杂的顺序对所有字符串进行排序
  3. 处理&#34; NULL&#34;首先

    标准库有"partition" algorithm,它会将符合特定条件的所有元素移动到字符串的末尾。

    std::vector<string> vec {
        "Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"
    };
    auto comparator = 
        [](const std::string& lhs, const std::string& rhs)
        {
            return rhs == "NULL" or lhs <= rhs; 
        };
    std::sort(vec.begin(), vec.end(), comparator);
    

    按复杂比较排序

    comp()

    请注意此处的比较与您的comp()功能之间的差异。比较器回答问题&#34;如果第一个字符串我来到第二个字符串之前?&#34; - 而您的{{1}}函数根本没有给出符合您要求的答案。

答案 1 :(得分:1)

您可以使用分区算法:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, const char * argv[]) {

    vector<string> vec {
        "Potato", "NULL", "NULL", "Charmander" , "Spaghetti", "NULL"
    };

    partition(begin(vec), end(vec), // Partition the values
               [](const string& s) { return s != "NULL"; });


    copy(begin(vec), end(vec), ostream_iterator<string>{cout, " "});
    cout << endl;

    return 0;
}
// RESULT: Potato Spaghetti Charmander NULL NULL NULL 

注意:如果您需要维护相对顺序,请使用stable_partition。

答案 2 :(得分:0)

您可以编写自己的函数版本,将一些字符串放在最后:

namespace myAlgo {
        template<typename ForwardIter, class T >
        ForwardIter moveToEnd(ForwardIter first, ForwardIter last, const T& value) {
            if (first == last) {
                return first;
            }
            ForwardIter fasterFirst = first;
            //Shift strings that do not match value to the left in stable manner
            while (++fasterFirst != last) {
                if (*fasterFirst != value) {
                    *++first = *fasterFirst;
                }
            }
            ForwardIter pivot = first;
            //Fill rest with value
            while (first != last) {
                *++first = value;
            }
    return pivot;
    }
}

然后只是:

myAlgo::moveToEnd(vec.begin(), vec.end(), "NULL");