如果我想要忽略重复元素,应该使用哪个STL容器?

4
我正在寻找一些STL(但不是boost)容器,经过以下操作后将包含2个元素:“abc”和“xyz”:
std::XContainer<string> string_XContainer;
string_XContainer.push_back("abc");
string_XContainer.push_back("abc");
string_XContainer.push_back("xyz");

顺便说一下,我只需要在最后调用string_XContainer.size()来获取唯一字符串的总数。也许我甚至不需要一个容器,有一种更优雅的方法可以实现吗?

1个回答

18

std::set 是你需要的。一个 set 最多只包含每个元素的一个实例,根据你定义的某个比较函数进行比较。

这是获取唯一字符串数量的一种方法。从你的示例来看,字符串已经按排序顺序排列了?如果是这样,那么你可以创建一个数组(或其他简单的结构)并使用 std::unique 算法。


是的,set就是这个容器。@Igor Oks,但请注意,在set中插入元素的顺序不会被保留,我想这并不是必需的。 - Naveen
它不会保持插入顺序,但它会保持严格弱排序。 - Nikola Smiljanić
不要忘记,unique 只能用于已排序的范围。您可以使用 std::adjacent_find(iBegin, iEnd, std::greater<value_type>()) == iEnd 技巧测试范围是否已排序,如果没有,则只应用 sort - Matthieu M.
2
优化之前先进行性能分析:如果std::sort在已排序的数据集上已经具有O(N)的复杂度(很可能是这种情况),那么使用adjacent_find就没什么帮助了。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接