c – 关于std :: vector的两个简短问题
发布时间:2020-12-16 10:27:54 所属栏目:百科 来源:网络整理
导读:创建向量时,它具有默认分配大小(可能这不是正确的术语,可能是步长?).当元素数量达到此大小时,将调整向量的大小.这个尺寸编译器是否具体?我可以控制它吗?这是一个好主意吗? 重复调用vector :: size()会重新计算元素的数量(O(n)计算),或者将此值存储在某处
>创建向量时,它具有默认分配大小(可能这不是正确的术语,可能是步长?).当元素数量达到此大小时,将调整向量的大小.这个尺寸编译器是否具体?我可以控制它吗?这是一个好主意吗?
>重复调用vector :: size()会重新计算元素的数量(O(n)计算),或者将此值存储在某处(O(1)lookup).例如,在下面的代码中 // 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; } 编辑:由Nicolai Josuttis撰写的IMO,C标准图书馆是对此类事物的极好参考. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |