检查数组索引是否存在。

4
有没有办法检查数组的给定索引是否存在?
我想设置数字索引,例如1、5、6和10。因此,我想查看这些索引是否已经存在,如果存在,就增加另一个计数器。
我通常使用php,但我现在正在尝试在c++中实现这个功能,所以我想问是否有一种类似于isset()的方法可以在c++中使用。
附注:使用向量(vectors)是否更容易?如果是这样,请问有什么好的向量教程可以推荐吗?谢谢。
4个回答

8

C++中,数组的大小在声明时就已经固定,虽然你可以访问超出声明数组大小的位置,但这非常危险,容易导致难以追踪的错误:

int i[10];
i[10] = 2; // Legal but very dangerous! Writing on memory you don't know about

看起来你想要类似数组的行为,但不需要填充所有元素。传统上,这属于哈希表的范畴。向量在这里不是很好的解决方案,因为你会有空元素占据空间,更好的方法是使用类似地图的东西,可以通过搜索元素并解释结果来测试元素是否存在:

#include <map>
#include <string>

// Declare the map - integer keys, string values    
std::map<int, std::string> a;

// Add an item at an arbitrary location
a[2] = std::string("A string");

// Find a key that isn't present
if(a.find(1) == a.end())
{
   // This code will be run in this example
   std::cout << "Not found" << std::endl;
}
else
{
   std::cout << "Found" << std::endl;
}

需要注意的一点是:使用上述方法来查找键是否存在,而不是像测试默认值一样进行测试。

if(a[2] == 0)
{
    a[2] = myValueToPutIn;
}

当访问某个键值时,如果当前不存在任何内容,地图的行为是在该键值上插入一个默认构造的对象。


谢谢 :) 我会研究一下 map 类并尝试使用它。再次感谢! - AntonioCS
你也可以使用 map.at() 而不是 [],如果元素不存在则会抛出异常。 - coppro

3

我个人的建议是使用向量。它们可以动态调整大小,只要不做愚蠢的事情(例如尝试访问不存在的元素),它们就非常易于使用。

至于教程,我能给你的最好建议是进行谷歌搜索


2

如果不使用向量,您可以通过将要访问的索引与数组的大小进行交叉检查来实现。例如:if(index < array_size),则该索引无效。

如果您不知道数组的大小,可以使用sizeof运算符找到它。

例如:

int arr[] = {5, 6, 7, 8, 9, 10, 1, 2, 3};
int arr_size = sizeof(arr)/sizeof(arr[0]);

1

在我看来,似乎地图是最接近你想要的东西。你可以使用STL(标准模板库)中的Map类(http://www.cppreference.com/wiki/stl/map/start)。

地图提供一个容器,其中的对象可以通过键(即你的“索引”)进行引用。


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