unordered-set 相关问题

`std :: unordered_set`是一个包含一组唯一对象的关联容器。搜索,插入和删除具有平均的恒定时间复杂度。

std::unordered_set 与 constexpr std::vector 用于存储不可变数据

不幸的是,即使 C++23 也没有 constexpr 集:( 我希望存储适量(可能~100)的字符串,代表系统中存在的不同配置。我只需要

回答 1 投票 0

具有同一类指针 std::unordered_set 的类

我正在尝试创建一个包含指向同一类的 std::unordered_set 指针的类,但我无法找到在声明该类之前准备哈希函数的方法。 结构散列 {...

回答 1 投票 0

std::unordered_set 的查找时间不是常数

为了找出适合我特定目的的最佳容器类型,我比较了 std::vector、排序 std::vector 与二分搜索、std::set 和 std::unordered_set 的查找时间。这是...

回答 1 投票 0

描述不可变的有序集合的类

我需要一些描述不可变的有序集的类/接口名称(按输入顺序,如 LinkedHashSet)。我当然可以像这样使用该类: 类 Foo { 公开最终集 我需要一些类/接口名称来描述不可变的有序集(按输入顺序,如LinkedHashSet)。我当然可以像这样使用这个类: class Foo { public final Set<Long> frozenOrderedSet; public Foo(List<Long> input) { frozenOrderedSet = Collections.unmodifiableSet(new LinkedHashSet(input)); } } 但这并不能澄清我的方法。我想向阅读源代码的每个人明确表示,该集合是不可修改且唯一的,同时使用 for(Long l : set){} 保持其顺序。 Guava 的 ImmutableSet 提供 a high-performance, immutable Set with reliable, user-specified iteration order. 还有像 ImmutableSortedSet 这样的变体。 最简单的方法是扩展 Set 来创建自定义的不可变 Set。 public CustomImmutableSet(){ return Collections.unmodifyingSet(new LinkedHashSet(输入)); } 这样,每个阅读源代码的人都会清楚该集合是不可修改且唯一的 Bozho 有问题Java 不可变集合: 不可修改的集合通常是只读视图(包装器) 其他收藏。您无法添加、删除或清除它们,但 底层集合可能会改变。 不可变集合根本无法更改 - 它们不会换行 另一个系列 - 他们有自己的元素。 这是番石榴的 ImmutableList 的引用 与 Collections.unmodifyingList(java.util.List) 不同, 这是一个仍然可以改变的单独集合的视图, ImmutableList 的实例包含它自己的私有数据,并且永远不会 改变。 所以,基本上,为了从 可变集合,您必须将其元素复制到新集合中,并且 禁止所有操作。 所以基本上你可以创建类 TreeSet 的子类并覆盖所有 :add、remove 等方法,以抛出一个异常,说明这是不可变的集合。此外,您还必须在此类中使用一个参数创建复制构造函数TreeSet setToCopyFrom。 java.util.Collection源内部实现了使用静态包范围内部类生成不可修改集合的方法。 您可以将这些类的实现从 JDK 中的源代码复制到您的包中并将其公开。然后,您可以在代码中使用类型说明符,明确声明集合不可修改、已排序等。 毫无疑问,JDK 开发人员选择不公开这些类型是有原因的,但我不知道它是什么。 从 JDK 修改代码 此代码来自 JDK 21,实现与 JDK 相同,但类被定义为公共的,因此可以从任何包中使用它们。 不可修改的集合.java package org.example.unmodifable; import java.io.Serializable; import java.util.Collection; import java.util.Iterator; import java.util.Spliterator; import java.util.function.Consumer; import java.util.function.IntFunction; import java.util.function.Predicate; import java.util.stream.Stream; class UnmodifiableCollection<E> implements Collection<E>, Serializable { @java.io.Serial private static final long serialVersionUID = 1820017752578914078L; @SuppressWarnings("serial") // Conditionally serializable final Collection<? extends E> c; UnmodifiableCollection(Collection<? extends E> c) { if (c == null) throw new NullPointerException(); this.c = c; } public int size() { return c.size(); } public boolean isEmpty() { return c.isEmpty(); } public boolean contains(Object o) { return c.contains(o); } public Object[] toArray() { return c.toArray(); } public <T> T[] toArray(T[] a) { return c.toArray(a); } public <T> T[] toArray(IntFunction<T[]> f) { return c.toArray(f); } public String toString() { return c.toString(); } public Iterator<E> iterator() { return new Iterator<>() { private final Iterator<? extends E> i = c.iterator(); public boolean hasNext() { return i.hasNext(); } public E next() { return i.next(); } public void remove() { throw new UnsupportedOperationException(); } @Override public void forEachRemaining(Consumer<? super E> action) { // Use backing collection version i.forEachRemaining(action); } }; } public boolean add(E e) { throw new UnsupportedOperationException(); } public boolean remove(Object o) { throw new UnsupportedOperationException(); } public boolean containsAll(Collection<?> coll) { return c.containsAll(coll); } public boolean addAll(Collection<? extends E> coll) { throw new UnsupportedOperationException(); } public boolean removeAll(Collection<?> coll) { throw new UnsupportedOperationException(); } public boolean retainAll(Collection<?> coll) { throw new UnsupportedOperationException(); } public void clear() { throw new UnsupportedOperationException(); } // Override default methods in Collection @Override public void forEach(Consumer<? super E> action) { c.forEach(action); } @Override public boolean removeIf(Predicate<? super E> filter) { throw new UnsupportedOperationException(); } @SuppressWarnings("unchecked") @Override public Spliterator<E> spliterator() { return (Spliterator<E>) c.spliterator(); } @SuppressWarnings("unchecked") @Override public Stream<E> stream() { return (Stream<E>) c.stream(); } @SuppressWarnings("unchecked") @Override public Stream<E> parallelStream() { return (Stream<E>) c.parallelStream(); } } UnmodifyingSet.java package org.example.unmodifable; import java.io.Serializable; import java.util.Set; class UnmodifiableSet<E> extends UnmodifiableCollection<E> implements Set<E>, Serializable { @java.io.Serial private static final long serialVersionUID = -9215047833775013803L; UnmodifiableSet(Set<? extends E> s) { super(s); } public boolean equals(Object o) { return o == this || c.equals(o); } public int hashCode() { return c.hashCode(); } } 不可修改的SortedSet.java package org.example.unmodifable; import java.io.Serializable; import java.util.Comparator; import java.util.SortedSet; public class UnmodifiableSortedSet<E> extends UnmodifiableSet<E> implements SortedSet<E>, Serializable { @java.io.Serial private static final long serialVersionUID = -4929149591599911165L; @SuppressWarnings("serial") // Conditionally serializable private final SortedSet<E> ss; UnmodifiableSortedSet(SortedSet<E> s) {super(s); ss = s;} public Comparator<? super E> comparator() {return ss.comparator();} public SortedSet<E> subSet(E fromElement, E toElement) { return new UnmodifiableSortedSet<>(ss.subSet(fromElement,toElement)); } public SortedSet<E> headSet(E toElement) { return new UnmodifiableSortedSet<>(ss.headSet(toElement)); } public SortedSet<E> tailSet(E fromElement) { return new UnmodifiableSortedSet<>(ss.tailSet(fromElement)); } public E first() {return ss.first();} public E last() {return ss.last();} } 测试用例 不可修改的SortedSetTest.java package org.example.unmodifable; import java.util.List; import java.util.TreeSet; public class UnmodifiableSortedSetTest { public static void main(String[] args) { UnmodifiableSortedSet<String> frozenAnimals = new UnmodifiableSortedSet<>( new TreeSet<>(List.of("dog", "cat", "lion", "cat")) ); System.out.println(frozenAnimals); try { frozenAnimals.add("pigeon"); } catch (UnsupportedOperationException e) { System.out.println("You can't modify the frozen list of animals."); } } } 测试输出: [cat, dog, lion] You can't modify the frozen list of animals.

回答 4 投票 0

将 EdgeList 作为 unordered_set 存储在 Boost Graph Library 上

我正在重现一个科学实验,我需要将图的边集存储为无序集。我正在尝试使用 BGL adjacency_graph,我认为最后一个参数是 hash_...

回答 3 投票 0

在shared_ptr的unordered_set中查找一个值

我想在unordered_set中找到一个值,但失败了: typedef std::shared_ptr IntPtr; std::unordered_set s; s.insert(std::make_shared(42)); 布尔找到 = s.fi...

回答 2 投票 0

为什么std::set没有提供try_emplace成员函数?

std::map(和std::unordered_map)的try_emplace成员函数的一个优点是,如果映射中已存在键,则它不会分配新节点。我想知道为什么这个成员函数有...

回答 1 投票 0

std::unordered_set 上下文中的哈希桶

我试图在 std::unordered_set 的上下文中理解哈希。 Cppreference 给出了这样的解释: 在内部,元素不按任何特定顺序排序,但是 组织成降压...

回答 1 投票 0

使用 unordered_set/unordered_multiset 导致迭代器失效

我知道,unordered_set 会使迭代器无效: “如果发生重新散列(由于插入),所有迭代器都会失效。” 很明显,因为我们有带桶的哈希表,但是......

回答 1 投票 0

调整 unordered_set 的大小如何影响性能?

据我所知,调整数组大小(例如需要调整数组大小的向量上的push_back)是 O(n) 复杂度。如果是这种情况,这是否适用于在 unordered_set 中插入?调整大小了吗...

回答 1 投票 0

C++ 20 unordered_set 库方法用于求差、交集和并集?

我见过一些类似的问题,比如这个,这个和这个,但是它们都已经很老了,可能已经过时了。 现在是 2023 年,最新的 C++ 标准是 2020 年发布的 C++20,

回答 1 投票 0

如何使用自定义比较器为三元组(“tuple”)声明/使用“unordered_set”?

如何使用自定义比较器声明/使用三元组(元组)的 unordered_set? 我需要将浮点数的三元组(作为元组处理)存储在一组中以检查潜在的重复项。因为是关于Floa的...

回答 1 投票 0

unordered_set什么时候调用operator==?

在我看来, 这就是 unordered_set 插入的工作原理。 当调用 insert 时,会调用哈希函数。 在下面的代码中,我对第一个和第二个值进行散列每个...

回答 1 投票 0

unordered_set of std::filesystem::path 作为数据成员

我正在尝试创建一个具有 unordered_set of paths 作为数据成员的类。 起初,我用这个成员声明了一个类并得到了错误: 试图引用已删除的函数 读了几遍后

回答 1 投票 0

插入具有已知哈希值的 C++ unordered_map

我有一个“表”,它是一个 std::unorderd_set,基本上,std::vector 带有一个散列函数,该函数返回向量中所有元素的散列值的 XOR。因此,哈希-

回答 2 投票 0

在C++中访问unordered_set的最后一个元素。

我创建了一个[2,3,5]的unordered_set,我想按FIFO顺序访问,用unordered_set怎么可能,试过了,但得到了编译错误。 int showFirstUnique() { if(...

回答 1 投票 0

clear()会影响std::unordered_set的桶数吗?

std::vector有很多答案,但std::unordered_set呢?我真正的问题(与此密切相关)是:通过在每个......之前清空同一个无序集来重复使用它是否有效?

回答 1 投票 7

将向量中的所有元素复制到map / unordered_map的C ++最佳方法

使用C ++,如果我想将向量转换为set或unordered_set容器,可以很容易地通过以下方式完成:#include #include #include #include ] >

回答 1 投票 -1

按功能值传递unordered_map / unordered_set有效吗? c ++

通过值传递unordered_set是否有效? void func(unordered_set st){//基本条件。 //做一点事。几个插入和删除从圣。 func(st); }(函数...

回答 1 投票 0

会在迭代过程中访问在迭代过程中添加到std :: unordered_set(或unordered_map)中的元素吗?

我有如下代码:std :: unordered_set ht {1,2,3}; ht.reserve(10000); // ht对于(int i = 0; i

回答 2 投票 1

© www.soinside.com 2019 - 2024. All rights reserved.