预定义大小的静态数组中的元素数

时间:2010-05-17 03:49:38

标签: c++ arrays

我有一个这样的数组:

int a[100]; 

我只填充此数组中的前4个元素:

a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;

当我sizeof(a)/sizeof(a[0])时,它返回100.

有没有办法可以获得我已经为其赋值的元素数量,从而过滤掉剩余的96个未分配元素?

感谢

7 个答案:

答案 0 :(得分:8)

没有。没有什么可以追踪到的。

答案 1 :(得分:7)

没有。使用跟踪长度的数据结构(例如Vector),或者使用不能作为实际值出现的值预先填充数组,并在循环时测试该值和数组的结尾启动。

答案 2 :(得分:3)

必须将所有元素分配给某个元素,因此数组总是有100个元素。如果你可以确保所有元素都被初始化为一个特殊值,这意味着“未分配”给你(例如-1),你可以这样做:


// fill the array with a special value which means "uninitialized"
const int special_uninitialized = -1;
std::fill(&a[0], &a[100], special_uninitialized);

// set up your values
a[0] = 1;

// count
std::size_t uninitialized_count = std::count(&a[0], &a[100], special_uninitialized);
std::size_t initialized_count = 100 - uninitialized_count;

如果您只想知道数组中有多少元素,您可以选择以下选项:

  1. 不要使用数组,使用具有std::vector功能的size(),通常是比基本数组更好的选择

  2. 在一个单独的变量

  3. 中自行跟踪元素数量
  4. 使用如上所述的特殊“未分配”值,并使用std::find查找第一个,并通过从中减去第0个元素的地址来计算出有多少个。这是一个非常难看的解决方案。

  5. 对于初学者,std::vector是一个更好的选择。您可以像这样使用它:

    
    std::vector<int> vec;
    
    vec.push_back(17);
    vec.push_back(23);
    vec.push_back(5);
    
    int x = vec[0]; // x will be 17
    vec[0] = 40; // set element 0
    
    size_t s = vec.size(); // s will be 3
    

答案 3 :(得分:1)

假设你是初学者(因而没有跳入STL),这里是@Mitch正在讨论的一个例子:

char *Names[100] = {}; // zero init

Names[0] = "hello";
Names[1] = "world";

for (int n = 0; n < 100 && Names[n] != 0; ++n)
    if (!Names[n])
        break;

printf("# of entries: %d", n);

现在只有将内存使用量保持在绝对最低值时才会这样做。

答案 4 :(得分:0)

为什么不在这种情况下使用像std::map这样的关联容器?它允许您使用std::map::find()

测试它是否包含具有给定键的条目
std::map<size_t, int> myMap;
myMap[0] = 1;
// ...
bool contains = myMap.find(0) != myMap.end();

答案 5 :(得分:0)

在邮件标题中,您将数组称为“静态”。如果这确实是具有静态存储持续时间的数组,则默认情况下在程序启动时,其元素将默认为零。由于您在示例中使用的“已分配”值不为零,因此您可以通过查找数组中的第一个零元素来确定已分配的元素数。当然,只有当“赋值”值保证为非零时才会起作用,即如果零值可以被认为是保留值。

答案 6 :(得分:0)

我认为使用boost :: optional作为数组类型可以解决问题:

boost::optional<int> a[100];

因此,您可以检查元素是否设置如下:

if (! a[i]) {   // element not set
}
else {  // element not set
}

使用boost:array而不是裸静态数组也可能是个好主意。

相关问题