代码之家  ›  专栏  ›  技术社区  ›  Joao Noch

给定一个向量,擦除低于itemsnum[重复]的元素

  •  1
  • Joao Noch  · 技术社区  · 9 年前

    这是我的函数,用于删除字符串“results”向量中的所有元素,这些字符串的长度没有“itemsnum”长。然而,我有点担心它多次调用自己,有没有更简单的方法?

    vector<string> eraselower(vector<string> results, int itemsnum){ //erases all elements in vector which are not long enough
        for (unsigned j=0; j<results.size(); j++){
            if(results[j].length()<itemsnum ){ results.erase(results.begin()+j); }}
        for (unsigned j=0; j<results.size(); j++){
            if(results[j].length()<itemsnum ){ results=eraselower(results,itemsnum);}}
        return results;
    }
    

    谢谢

    3 回复  |  直到 9 年前
        1
  •  4
  •   Kerrek SB    9 年前

    最好的方法是删除习惯用法:

    #include <algorithm>
    #include <string>
    #include <vector>
    
    std::vector<std::string> eraselower(std::vector<std::string> results, int itemsnum)
    {
        results.erase(
            std::remove_if(results.begin(), results.end(),
                          [itemsnum](const std::string & s) {
                              return s.size() < itemsnum; }),
            results.end());
        return results;
    }
    
        2
  •  0
  •   aschepler    9 年前

    你的主要问题是第一个 for 环例如,如果 results[2] results[3] j==2 然后删除第二个元素-它将之后的所有内容向下移动一个槽,因此短字符串是 结果[3] 结果[2] .然后 j 到3,所以你永远不会检查第二个短字符串,现在是 结果[2]

    第二个递归循环确实负责正确地“修复”它,但你是对的,这很愚蠢。

    std::remove_if vector::erase 然后将向量收缩到正确的大小:

    vector<string> eraselower(vector<string> results, int itemsnum){ 
        //erases all elements in vector which are not long enough
        results.erase( std::remove_if( results.begin(), results.end(),
            [itemsnum](const std::string& s) { return s.length() < itemsnum; } ),
            results.end() );
    
        return results;
    }
    

    您可能需要考虑通过非常量引用获取向量,而不是通过复制传递,然后返回另一个修改过的向量。

        3
  •  0
  •   Boris Dalstein    9 年前

    vector<string> eraselower(const vector<string> & strings, int itemsnum)
    {
        vector<string> res;
        res.reserve(strings.size());
        for (const string & s: strings) {
            if (s.length() >= itemsnum) {
                res.push_back(s);
            }
        }
        return res;
    }