我知道一个简单的int向量具有O(1)随机访问时间,因为在给定所有元素具有相同大小的情况下,很容易计算第x个元素的位置。
现在有了一个字符串向量吗?
由于字符串长度不同,它不能有O(1)随机访问时间,可以吗?如果可以的话,背后的逻辑是什么?
感谢。
更新
答案非常简洁明了,谢谢大家的帮助。 我接受了乔伊的回答,因为它简单易懂。
答案 0 :(得分:12)
向量确实有O(1)访问时间。
String对象的大小都相同(在给定的实现上),无论它们表示的字符串大小如何。通常,字符串对象包含指向已分配内存的指针,该内存保存字符串数据。
因此,如果s
是std::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的固定大小更大 - 在很多情况下,字符串对象不在堆上分配了块来保存实际数据。