Для строки операция size()
имеет значение , которое должно быть постоянным для всех реализаций строки, которые не используют веревки (1) . В стандарте нет явного требования, согласно которому операция должна быть O(1)
, наиболее близким является общее требование, согласно которому size()
должно быть постоянным временем, но при этом остается место для любой другой меры сложности.
Так почему должно быть O (1)?
Это происходит из-за того, что размер не может быть рассчитан из содержимого самой строки. В то время как в C вы используете терминатор NUL для определения конца строки, в C ++ NUL так же допустим, как и любой другой символ в строке. Поскольку размер строки не может быть вычислен из содержимого (2) , он должен обрабатываться извне, независимо от фактического размера строки.
(1) Стандарт C ++ 03 позволяет реализации использовать ropes в качестве реализации для строк, но факт в том, что ни одна из текущих реализаций стандартных библиотек не использует их.
(2) Если в реализации используются веревки, операция может зависеть от размера посредством количества блоков, из которых была построена веревка, если блоки были связаны через связанный список или подобную конструкцию или если им было разрешено иметь разные размеры. Но веревки не используются ни в одной стандартной реализации библиотеки, о которой я знаю.