加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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标准图书馆是对此类事物的极好参考.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读