C ++:字符串向量的随机访问时间如何工作?

时间:2010-09-20 16:33:25

标签: c++

我知道一个简单的int向量具有O(1)随机访问时间,因为在给定所有元素具有相同大小的情况下,很容易计算第x个元素的位置。

现在有了一个字符串向量吗?

由于字符串长度不同,它不能有O(1)随机访问时间,可以吗?如果可以的话,背后的逻辑是什么?

感谢。

更新

答案非常简洁明了,谢谢大家的帮助。 我接受了乔伊的回答,因为它简单易懂。

5 个答案:

答案 0 :(得分:12)

向量确实有O(1)访问时间。

String对象的大小都相同(在给定的实现上),无论它们表示的字符串大小如何。通常,字符串对象包含指向已分配内存的指针,该内存保存字符串数据。

因此,如果sstd::string,则sizeof s是常量且等于sizeof(std::string),但s.size()取决于字符串值。向量只关心sizeof(std::string)

答案 1 :(得分:5)

字符串引用存储在一个位置。字符串可以存储在存储器中的任何位置。因此,您仍然可以获得O(1)随机访问时间。

 ---------------------------
| 4000 | 4200 | 5000 | 6300 |  <- data
 ---------------------------
 [1000] [1004] [1008]  [1012]  <- address


 [4000]    [4200]    [5000]     [6300]     <- starting address
"string1" "string2" "string3"  "string4"   <- string

答案 2 :(得分:4)

因为字符串对象具有固定大小,就像任何其他类型一样。区别在于字符串对象在堆上存储自己的字符串,并且它保留指向大小固定的字符串的指针。

答案 3 :(得分:2)

std :: string中的实际字符串通常只是一个指针。字符串的大小始终相同,即使它所包含的字符串的长度也不同。

答案 4 :(得分:2)

你已经得到了许多答案(例如,Steve Jessop和AraK),这些答案已经是正确的。我只添加一个小细节:std::string的许多当前实现使用所谓的短字符串优化(SSO),这意味着它们在字符串对象本身中分配一小块固定的空间,可以使用存储短字符串,并且只有当/如果长度超过字符串对象本身分配的长度时,它实际上在堆上分配单独的空间来存储数据。

就字符串向量而言,这没有什么区别:每个字符串对象都有固定的大小,而不管字符串本身的长度。区别在于SSO的固定大小更大 - 在很多情况下,字符串对象在堆上分配了块来保存实际数据。