使用std::set_union() 算法的替代方法是使用std::set 或std::unordered_set 容器来存储两个向量的所有元素,然后从该容器初始化结果向量。
这种方法的缺点是额外的容器需要两个向量中唯一元素数量的线性空间。
您使用哪个容器,将取决于您是否需要对结果向量进行排序。如果您不需要对结果向量进行排序,则可以使用std::unordered_set:
std::vector<std::string> make_unsorted_union(const std::vector<std::string>& a,
const std::vector<std::string>& b)
{
std::unordered_set<std::string> st;
for (auto& str: a)
st.insert(str);
for (auto& str: b)
st.insert(str);
return std::vector<std::string>(st.begin(), st.end());
}
将元素插入std::unordered_set 平均可以在恒定时间内完成。
如果您需要对结果向量进行排序,则可以使用 std::set 代替:
std::vector<std::string> make_sorted_union(const std::vector<std::string>& a,
const std::vector<std::string>& b)
{
std::set<std::string> st;
for (auto& str: a)
st.insert(str);
for (auto& str: b)
st.insert(str);
return std::vector<std::string>(st.begin(), st.end());
}
这些函数可以按如下方式使用:
int main() {
std::vector<std::string> a = {"a", "z", "z", "b", "z"};
std::vector<std::string> b = {"d", "v", "c", "x", "e"};
std::vector<std::string> c = make_unsorted_union(a, b);
for (auto& str: c)
std::cout << str << ' ';
std::cout << '\n';
c = make_sorted_union(a, b);
for (auto& str: c)
std::cout << str << ' ';
std::cout << '\n';
}
我这个程序的输出是:
e c x b v d z a
a b c d e v x z