• 创建 vector 时,它具有默认的分配大小(可能这不是使用正确的术语,也许是步长?)。当元素数量达到此大小时,将调整 vector 的大小。这个大小的编译器是特定的吗?我可以控制吗?这是一个好主意吗?
  • 重复调用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++标准库在此类情况下是极好的引用。

    10-07 15:58
    查看更多