在C++ STL向量中检查特定元素是否存在

3

在访问v[i]之前,我想检查特定向量位置i上的元素是否存在。请问如何实现?

谢谢。


1
我很困惑。为了找出一个元素是否存在,您必须访问向量。那么,如果不访问向量,如何确定位置i处是否存在元素?使用另一个向量吗? - Thomas Matthews
访问向量显然是可以的,但使用未经检查的参数(“如v[i]”)调用operator[]是不可取的。 - MSalters
5个回答

9
if (0 <= i  &&  i < v.size()) {
  // OK
  std::cout << v[i]; // Example
} else {
  // Wrong
}

我不明白如何利用向量的大小来判断向量中是否存在某个元素?如果给定一个包含500个元素的向量,size方法如何帮助我确定第10个位置上的元素是否存在? - Thomas Matthews
我认为这个问题的意思是“如何查找在索引为i的位置上是否存在元素(或任何值)”。 - anon
@Thomas,size()返回向量中实际元素的数量。因此,v[n](其中0 <= n < size())必须包含一个元素。 - Graphics Noob

4

向量是连续的元素序列,不可能存在“空洞”,因此在每个位置i(其中i >= 0i < v.size())都保证存在一个元素。


2
使用 v.size()

1
我知道如何做,但我猜你的答案对提问者没有帮助。你是怎么做的? - Johann Gerell

1
如果你想知道一个元素是否存在于向量中,最快的方法是对数组进行排序,然后使用二分查找等搜索方法。
如果需要执行此操作多次,则改变数据结构可能会提高性能。对于这种情况,std::map 是一个不错的选择,如果您的编译器有哈希表或映射,则可以使用它们。
否则,在不访问向量的情况下确定值是否存在于向量中的唯一方法是使用第二个数据结构来记住该值和位置。

2
这可能会更快,也可能不会更快。如果每次排序只执行一次搜索,则线性搜索可能比排序要快得多。 - anon

0
我了解你有一个预先分配了特定维度的std::vector,假设是n,并且你想要查看索引i(i < n)处的元素是否被初始化或仅被分配。
像@Thomas Matthews所说,你可以使用第二个数据结构,一个简单的bool[n],其中在索引k处,如果你的向量中索引k处的元素存在,则存储true; 否则存储false。
      0 1 2 3 4 5
v = [ *   *   * * ]

             0     1      2     3     4     5
exists = [ true, false, true, false, true, true ]

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