C++ C++;向量下标超出范围(但它不是)

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

我正在制作一个自上而下的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 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
from
rbegin
to
rend
-(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;
}