vector::size()
会重新计数元素的数量(O(n)
计算),或者此值存储在某个位置(O(1)
查找)。例如,在下面的代码中// Split given string on whitespace
vector<string> split( const string& s )
{
vector<string> tokens;
string::size_type i, j;
i = 0;
while ( i != s.size() ) {
// ignore leading blanks
while ( isspace(s[i]) && i != s.size() ) {
i++;
}
// found a word, now find its end
j = i;
while ( !isspace(s[j]) && j != s.size() ) {
j++;
}
// if we found a word, add it to the vector
if ( i != j ) {
tokens.push_back( s.substr(i, j-i) );
i = j;
}
}
return tokens;
}
假设
s
可能很大,我应该只调用s.size()
一次并存储结果吗?谢谢!
最佳答案
在大多数情况下,除非您提前知道项目数,否则应该不理会分配,以便可以保留正确的空间量。
至少在我知道的每种情况下,std::vector::size()
只会返回存储的值,因此它具有恒定的复杂性。从理论上讲,C++标准允许它执行其他操作。有理由允许其他一些容器(主要是std::list
)以其他方式使用,而不是对其进行特殊处理,它们只是为所有容器推荐恒定的时间,而不是对任何容器都要求固定的时间。我无法完全想象一个包含元素的vector::size
,我很显然还没有这样的东西。
P.S.是执行上述代码的一种更简单的方法,它是这样的:
std::vector<string> split(std::string const &input) {
vector<string> ret;
istringstream buffer(input);
copy(istream_iterator<string>(input),
istream_iterator<string>(),
back_inserter(ret));
return ret;
}
编辑:IMO,由Nicolai Josuttis提供的C++标准库在此类情况下是极好的引用。