gpt4 book ai didi

c++ - 您可以将附加参数传递给谓词吗?

转载 作者:IT老高 更新时间:2023-10-28 22:34:35 25 4
gpt4 key购买 nike

我正在尝试过滤 vector ,使其仅包含特定值。

例如确保 vector 仅包含值为“abc”的元素。

现在,我正在尝试使用 remove_copy_if 来实现这一点。

在使用 std 的一种算法时,有什么方法可以将附加参数传递给谓词?

std::vector<std::string> first, second;
first.push_back("abc");
first.push_back("abc");
first.push_back("def");
first.push_back("abd");
first.push_back("cde");
first.push_back("def");

std::remove_copy_if(first.begin(), first.end(), second.begin(), is_invalid);

我希望将以下函数作为谓词传递,但这似乎更有可能最终将 remove_copy_if 正在检查的当前值与下一个值进行比较。

bool is_invalid(const std::string &str, const std::string &wanted)
{
return str.compare(wanted) != 0;
}

我有一种感觉,我可能正在接近这个错误,所以任何建议都将不胜感激!

谢谢

最佳答案

改为定义一个仿函数:

struct is_invalid
{
is_invalid(const std::string& a_wanted) : wanted(a_wanted) {}
std::string wanted;
bool operator()(const std::string& str)
{
return str.compare(wanted) != 0;
}
};

std::remove_copy_if(first.begin(),
first.end(),
second.begin(),
is_invalid("abc"));

或者如果 C++11 使用 lambda:

std::string wanted("abc");
std::remove_copy_if(first.begin(), first.end(), second.begin(),
[&wanted](const std::string& str)
{
return str.compare(wanted) != 0;
});

注意输出 vector ,second必须在调用remove_copy_if()之前有元素:

// Create 'second' after population of 'first'.
//
std::vector<std::string> second(first.size());

std::string wanted = "abc";
int copied_items = 0;
std::remove_copy_if( first.begin(), first.end(), second.begin(),
[&wanted, &copied_items](const std::string& str) -> bool
{
if (str.compare(wanted) != 0) return true;
copied_items++;
return false;
});
second.resize(copied_items);

随着仿函数谓词被复制,需要更多的努力来保留 copied_items 信息。见 Pass std algos predicates by reference in C++建议的解决方案。

关于c++ - 您可以将附加参数传递给谓词吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13525361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com