i你哟 发表于 2023-11-15 21:21:09

C++谓词

bool com(const string& a){
        return a.size() < 5;
}
int main()
{

        vector<string> name = {"namenamename","zhangzhang","yuyu"};
        for (auto &a : name){
                auto aa = partition(a.begin(),a.end(),com);
                for (;aa<=a.end();aa++){
                        cout <<*aa<<" ";
                }
        }
        return 0;
}

std::__cxx11::basic_string<char>&' from expression of type 'char'
      else if (!bool(__pred(*__last)))
这里一直再报这个错误,这是为什么?

isdkz 发表于 2023-11-15 21:21:22

这个程序中出现错误是因为 partition 函数的使用有误。 partition 函数是用来对范围内的元素进行重新排列,使得满足指定条件的元素在前面,不满足条件的元素在后面,并返回第一个不满足条件的元素的迭代器。在这个例子中, partition 函数被错误地用在了 string 对象上,而不是 vector<string> 上。

正确的做法是将 partition 函数应用于 vector<string> ,并且在lambda表达式中传递 com 谓词函数来进行分区。下面是修改后的代码:

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

bool com(const std::string& a){
    return a.size() < 5;
}

int main()
{
    std::vector<std::string> name = {"namenamename", "zhangzhang", "yuyu"};
    for (auto &a : name){
      auto aa = std::partition(a.begin(), a.end(), com);
      for (auto it = a.begin(); it != aa; ++it){
            std::cout << *it << " ";
      }
      std::cout << std::endl;
    }
    return 0;
}


这样修改后,程序将正确地输出每个字符串中长度小于5的部分。
页: [1]
查看完整版本: C++谓词