我正在尝试过滤矢量,因此它只包含一个特定的值.
例如,确保向量仅包含值"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);
Run Code Online (Sandbox Code Playgroud)
我希望将以下函数作为谓词传递,但似乎更有可能最终将比较正在检查的当前值remove_copy_if和下一个.
bool is_invalid(const std::string &str, const std::string &wanted)
{
return str.compare(wanted) != 0;
}
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,我可能正在接近这个错误所以任何建议将不胜感激!
谢谢
hmj*_*mjd 19
改为定义一个仿函数:
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"));
Run Code Online (Sandbox Code Playgroud)
或者如果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;
});
Run Code Online (Sandbox Code Playgroud)
需要注意的是输出向量,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);
Run Code Online (Sandbox Code Playgroud)
随着仿函数谓词的复制,需要更多的努力来保留copied_items信息.有关建议的解决方案,请参阅C++中的引用传递std algos谓词.
制作仿函数或使用std/boost::bind.
struct is_invalid
{
public:
is_invalid(const std::string& w):wanted(w) { }
bool operator () (const std::string& str)
{
return str.compare(wanted) != 0;
}
private:
std::string wanted;
};
std::remove_copy_if(first.begin(), first.end(), second.begin(), is_invalid("abc"));
Run Code Online (Sandbox Code Playgroud)
绑定示例
bool is_invalid(const std::string &str, const std::string &wanted)
{
return str.compare(wanted) != 0;
}
std::remove_copy_if(first.begin(), first.end(), second.begin(),
boost::bind(is_invalid, _1, "abc"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8406 次 |
| 最近记录: |