C++ 中的矢量调整大小仅在添加 cout 语句时有效?

Vector Resizing in C++ works only when adding cout statement?

vector<string> solution(vector<string> inputArray) {
    int n = inputArray.size();
    vector<string> outputString(n);
    int maxSize, curPos = 0;
    for(auto &i: inputArray)
    {
        int currentSize = i.size();
        if(currentSize > maxSize)
        {
            maxSize = currentSize;
            curPos = 0;
            outputString[curPos++] = i;
        }else if (currentSize == maxSize)
        {
            outputString[curPos++] = i;
        }
    }
    cout<<curPos;
    outputString.resize(curPos);
    return outputString;
}

在没有 cout 行的原始代码中,outputString 产生一个空向量。但是在添加 cout 行后,问题就神奇地解决了。这背后的原因可能是什么?

int maxSize;

您声明了 maxSize,但未对其进行初始化,因此 maxSize 未初始化。并且您使用 maxSizecurrentSize 进行比较,这使其成为未定义的行为。 未定义的行为可以做任何事情,所以这是你的问题。

更改为:

int maxSize = std::numeric_limits<int>::min(); // in <limits> header

maxSize 未初始化,因此您的代码具有未定义的行为。 UB 产生令人惊讶的结果,比如打印一些东西改变了程序的行为。

通过使用 reserve 然后将字符串添加到向量中,您的代码可以简单得多:

vector<string> solution(const vector<string>& inputArray) {
    size_t n = inputArray.size();
    vector<string> outputString;
    outputString.reserve(n)
    for(auto &i: inputArray)
    {
        int currentSize = i.size();
        if(outputString.empty() || currentSize > outputString.front().size())
        {
            outputString.clear();
            outputString.push_back(i);
        }else if (currentSize == outputString.front().size())
        {
            outputString.push_back(i);
        }
    }
    return outputString;
}