C++ C++;向量下标超出范围(但它不是)
我正在制作一个自上而下的rgb像素阵列。我检查了一些东西的值,它给了我预期的输出。没有大于obj.size()的值,也没有小于0的值,我不知道发生了什么:/C++ C++;向量下标超出范围(但它不是),c++,vector,range,C++,Vector,Range,我正在制作一个自上而下的rgb像素阵列。我检查了一些东西的值,它给了我预期的输出。没有大于obj.size()的值,也没有小于0的值,我不知道发生了什么:/ std::vector<std::string> BMP_READER::TopBottom(std::vector<std::string> obj) { if (y_height <= 1) { return obj; } // nothing to reverse if its only one
std::vector<std::string> BMP_READER::TopBottom(std::vector<std::string> obj)
{
if (y_height <= 1) { return obj; } // nothing to reverse if its only one row
std::vector<std::string> new_v;
for (int h = 0; h < y_height; h++)
{
for (int i = x_width; i >= 1; i--)
{
int something = (obj.size() - i) - (x_width*h); // error
std::string val = obj[something];
new_v.push_back(val);
}
}
return new_v;
}
std::vector BMP\u阅读器::上下(std::vector obj)
{
如果(y_高度=1;i--)
{
int something=(obj.size()-i)-(x_width*h);//错误
std::string val=obj[something];
新的推送(val);
}
}
返回新的_v;
}
您应该能够将整个功能替换为:
#include <algorithm>
std::vector<std::string> BMP_READER::TopBottom(std::vector<std::string> obj)
{
std::reverse(obj.begin(), obj.end());
return obj;
}
#包括
std::vector BMP_阅读器::TopBottom(std::vector obj)
{
std::reverse(obj.begin(),obj.end());
返回obj;
}
请注意,这将使左下角位于右上角。代码中的这一行表示您只希望自上而下镜像:
if (y_height <= 1) { return obj; } // nothing to reverse if its only one row
if(y_height如果您需要编写自己的反向版本:
std::vector<std::string> BMP_READER::TopBottom(std::vector<std::string> obj)
{
for (std::size_t i = 0; i < obj.size() / 2; ++i)
{
std::swap(obj[i], obj[obj.size() - i - 1]);
}
return obj;
}
std::vector BMP\u阅读器::上下(std::vector obj)
{
对于(std::size_t i=0;i
这是一个只遍历一半元素的for循环
否则,请使用std::reverse
错误是否确实存在,或者当您使用某个索引时,“没有任何值大于obj.size()
”这可能不够:它必须严格小于obj.size()
,即值等于obj.size()
是不允许的。即使我没有按任何内容进行索引,错误也存在。我只是尝试删除检查函数返回向量的for循环。当我打开程序时,它仍然会崩溃,因为您同时从左到右和从上到下翻转,为什么这不只是std::reverse
,或者std::copy
fromrbegin
torend
?-(x_width*h)
闻起来不对。使用变量告诉你一个std::vector
的大小闻起来不对(它知道它的大小)。不使用std::reverse
闻起来不对。我记得,在这种情况下获取返回的移动语义返回移动(obj);
会有帮助。@Cheersandhth.-Alf很可能会被忽略。@ZacHowland;是的,但是当一个人几乎不费吹灰之力就能保证事情时,依赖可能的RVO是不好的。@Cheersandhth.-Alf第12.8/32节使得std::move(obj)
多余。这不仅仅是“依赖可能的RVO”,它实际上写在标准中。有关更多详细信息,请参阅Steve的答案。
std::vector<std::string> BMP_READER::TopBottom(std::vector<std::string> obj)
{
for (std::size_t i = 0; i < obj.size() / 2; ++i)
{
std::swap(obj[i], obj[obj.size() - i - 1]);
}
return obj;
}