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
未初始化。并且您使用 maxSize
与 currentSize
进行比较,这使其成为未定义的行为。
未定义的行为可以做任何事情,所以这是你的问题。
更改为:
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;
}
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
未初始化。并且您使用 maxSize
与 currentSize
进行比较,这使其成为未定义的行为。
未定义的行为可以做任何事情,所以这是你的问题。
更改为:
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;
}