使用lambda函数提取"std::set"容器的差异



我想提取两个集合之间的差异。当我也需要另一个容器中的结果时,这个问题提供了一个充分的答案。

下面的代码演示了我想做的事情:

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=调用该函数。

最新更新