我有
string email_list[] = {"aaa@sds.com", "bbb@sdsds.com"};
for (int i = 0; i < sizeof(email_list)/sizeof(email_list[0]); i ++) {
...
}
我看到一个有趣的事情:sizeof(email_list[0])
在VS2012的调试模式下返回28;但它在发布模式下提供24。但sizeof(email_list)/sizeof(email_list[0])
总是给出正确的值 - 2
。所以不确定这是否是循环通过这样一个数组的正确和可靠的方法?
其他STL容器如vector
,map
......?
答案 0 :(得分:5)
sizeof(arr)/ sizeof(arr [0])将始终为任何类型恢复固定大小数组arr中的元素数。
但要小心;如果arr已经腐烂成指针,它就不起作用。
始终定义arr [0],因为零长度数组在C ++中是不合法的。
至于调试版和发行版之间字符串的大小不同:这是允许的,因为标准没有规定该对象的大小。您可能会发现调试版本有一个类型指针来帮助调试。
答案 1 :(得分:4)
sizeof(array_name)/sizeof(array_name[0])
将始终为数组的大小
sizeof(array_name) = sizeof(array_name[0]) * number of elements in array_name
不同的编译器/构建版本可能会更改sizeof(array_name[0])
的值,但它始终有效。
你可以做的一件事就是使用一个ranged based for loop来迭代所有元素,而不必指定大小
for (const auto & e : email_list)
//...
这适用于所有数组,对于所有类型,都有begin
和end
成员或免费函数。
答案 2 :(得分:0)
如果您要确定容器中有多少条目,请不要使用sizeof。这告诉你管理容器的控制块的大小。
使用size()方法确定stl容器中的条目数。
请注意,此答案适用于此问题的标题。在问题的正文中,你有一个字符串数组。数组是从C继承的对象.sizeof(数组)/ sizeof(array [0])技术用于确定数组中的字符串数,但它不能用于确定字符串中的字符数(或者确定任何其他STL容器中的条目数。)
答案 3 :(得分:0)
我看到一个有趣的事情:sizeof(email_list [0])在VS2012的调试模式下返回28;但它在发布模式下提供了24个。
原因,至少在Visual Studio下,在调试模式下,宏定义_ITERATOR_DEBUG_LEVEL
设置为值2,这使得迭代器检查显然需要向字符串类添加4个字节。如果在预处理器定义中设置_ITERATOR_DEBUG_LEVEL=0
,那么在调试中你将拥有sizeof(std :: string)== 24。
发布和调试模式之间还有很多其他差异,您可以完成项目,并使其在调试版本下成功运行数小时,然后在Release下运行并立即崩溃。大多数(如果不是全部)这些错误都是代码中未定义行为的结果。
的sizeof(EMAIL_LIST)/的sizeof(EMAIL_LIST [0])
这将始终为您提供数组中的元素数量,因此您可以安全地将其用作调试和发布版本中的计数。
如何使用其他STL容器,例如vector,map ......?
vector有一个size()函数用于获取元素的数量(两个构建的值相同 - 除非某些宏更改),而map也提供了size()函数。但是你通常用迭代器迭代map。