我有一个这样的数组:
int a[100];
我只填充此数组中的前4个元素:
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
当我sizeof(a)/sizeof(a[0])
时,它返回100.
有没有办法可以获得我已经为其赋值的元素数量,从而过滤掉剩余的96个未分配元素?
感谢
答案 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;
如果您只想知道数组中有多少元素,您可以选择以下选项:
不要使用数组,使用具有std::vector
功能的size()
,通常是比基本数组更好的选择
在一个单独的变量
使用如上所述的特殊“未分配”值,并使用std::find
查找第一个,并通过从中减去第0个元素的地址来计算出有多少个。这是一个非常难看的解决方案。
对于初学者,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而不是裸静态数组也可能是个好主意。