删除容器中重复字符串并按长度排序…

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

using namespace std;

string make_plural(size_t ctr, const string &word,
    const string &ending)
{
    return (ctr > 1) ? word + ending : word;
}

bool IsShorter(const string &str1, const string &str2)
{
    return str1.size() < str2.size();
}

void ElimDups(vector &words)
{
    sort(words.begin(), words.end());

    auto end_unique = unique(words.begin(), words.end());
    words.erase(end_unique, words.end());
}

void BiggiesWithFind_if(vector &words,
    vector::size_type sz)
{
    //按字典排序, 删除重复单词
    ElimDups(words);

    //按长度排序, 长度相同的维持字典序
    stable_sort(words.begin(), words.end(),
        [](const string &str1, const string &str2)
    {return str1.size() < str2.size(); });

    //获取一个迭代器, 指向第一个满足size() > sz的元素
    auto wc = find_if(words.begin(), words.end(),
        [=](const string &s)//可以使用隐式捕获, 编译器会自己推断捕获内容
                            //捕获引用使用'&' , 捕获值使用'='
    {return s.size() >= sz;    });

    //计算满足条件元素的数目
    auto count = words.end() - wc;
    cout << count << " " << make_plural(count, "word", "s")
        << "  of length  " << sz << "  or longer" << endl;

    //打印每个长度大于等于要求的值的单词, 每个单词后面接一个空格
    for_each(wc, words.end(),
        [](const string &s) {cout << s << " "; });
    cout << endl;
}

void BiggiesWithPartition(vector &words,
    vector::size_type sz)
{
    ElimDups(words);
    auto wc = partition(words.begin(), words.end(),
        [sz](const string &str) {return str.size() < sz; });
    //计算满足条件元素的数目
    auto count = words.end() - wc;
    cout << count << " " << make_plural(count, "word", "s")
        << "  of length  " << sz << "  or longer" << endl;

    //打印每个长度大于等于要求的值的单词, 每个单词后面接一个空格
    for_each(wc, words.end(),
        [](const string &s) {cout << s << " "; });
    cout << endl;
}

int main(int argc, char **argv)
{
    vectorstr_vec{ "the", "red", "fox", "jump", "over", "the", "slow", "red", "turtle" };
    BiggiesWithFind_if(str_vec, 4);
    cout << "-------------------" << endl;
    BiggiesWithPartition(str_vec, 4);
    return 0;
}

posted @ 2014-07-18 21:07  wu_overflow  阅读(156)  评论(0编辑  收藏  举报