我想提取两个集合之间的差异。当我也需要另一个容器中的结果时,这个问题提供了一个充分的答案。
下面的代码演示了我想做的事情:
std::set<std::string> s1, s2, difference;
std::string difference_string = "";
std::set_difference(
s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(difference, difference.end()));
for (const std::string& s: difference) {
difference_string += s + ",";
}
if (0 < duplicateInPorts.size()) {
difference_string.pop_back(); //remove last comma
}
只是我发现创建一个局部变量很不方便,而实际上我只想有一个关于内容的字符串;我可以用lambda轻松编译。
std
中是否有一个方便功能可以让我做到这一点?我脑海中的语法与std::transform
类似。
std
中没有方便函数,但boost
中有一个。
boost::function_output_iterator
的示例几乎正是您想要的。略有调整:
struct string_joiner
{
string_joiner(std::string& s)
: m_str(s)
{}
void operator()(const std::string& x) const
{
m_str += m_sep;
m_str += x;
m_sep = ",";
}
std::string& m_str;
std::string mutable m_sep;
};
int main(int, char*[])
{
std::set<std::string> s1, s2;
std::string difference = "";
std::set_difference(
s1.begin(), s1.end(),
s2.begin(), s2.end(),
boost::make_function_output_iterator(string_joiner(difference)));
std::cout << difference << std::endl;
return 0;
}
function_output_iterator
只是一个可调用对象的包装器,为它提供了迭代器的接口。operator*
返回一个代理,该代理的operator=
调用该函数。