我可以指望任何STL容器的sizeof(string)或sizeof吗?

时间:2015-12-10 18:20:50

标签: c++ stl

我有

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容器如vectormap ......?

怎么样?

4 个答案:

答案 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)
    //...

这适用于所有数组,对于所有类型,都有beginend成员或免费函数。

答案 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。