What is the complexity of std::string::substr
member function? Is it defined by standard or implementation-defined?
A naïve implementation would be O(k) where k is the length of the resulting substring. std::string does not support copy-on-write. If you want O(1) substring operations, use a data structure such as a Rope.
This is all that standard has to say about it:
n3242, 21.4.7.8
- Requires:
pos <= size()
- Throws:
out_of_range
ifpos > size()
- Effects: Determines the effective length
rlen
of the string to copy as the smaller ofn
andsize() - pos
- Returns:
basic_string<charT,traits,Allocator>(data()+pos,rlen)
.
So the answer would be no, the complexity is not defined.
EDIT: Corrected as per n3242, pos > size not pos >= size
The C++11 standard does not define the performance characteristics of substr
, either in 21.4.7.8 or anywhere else I could find. In practice you can almost certainly expect O(n)
performance with n
being the length of the result.