【问题标题】:flip set of pixels with respect to a given row coordinate相对于给定行坐标翻转像素集
【发布时间】:2021-01-03 20:23:41
【问题描述】:

我正在尝试编写一个相对于给定行坐标翻转区域(表示为一组段)的程序。 我不太了解 C++,所以我遇到了一些错误,我不知道它们为什么会出现以及如何修复它们。 这是我到目前为止得到的:

struct Segment
{
    int row;
    int colStart;
    int colStop;
};

std::vector<Segment> FlipVertically(const std::vector<Segment>& region, const int flipRow){
    std::vector<Segment> vec, more, less;
    for (std::vector<Segment>::reverse_iterator it = region.rbegin(); it != region.rend(); ++it){
        if ((*it).row > flipRow){
                more.insert(more.begin(), *it);
            }
        else{less.insert(less.begin(), *it);}
        };
    std::sort(more.begin(), more.end(), [](Segment const &a, Segment const &b){
        return a.row > b.row;
        });
    std::sort(less.begin(), less.end(), [](Segment const &a, Segment const &b){
        return a.row > b.row;
        });
    vec.insert(vec.end(), more.begin(), more.end());
    vec.insert(vec.end(), less.begin(), less.end());
    int counter = 1;
    int i = 0;
    while(i + 1 < vec.size()){
        if (vec[i].row == vec[i + 1].row){
            vec[i].row = counter;
            }
        else{
            vec[i].row = counter;
            counter++;}
        i++;
        }
    vec.back().row = counter;    
    return vec;
    }

该函数应返回从上到下行存储的段,并且从左到右列在同一行中。 它说while循环中有一个错误:有符号和无符号整数表达式之间的比较[-Wsign-compare]。 另外,我正在寻找改进算法的技巧,因为我觉得它不好,因为我在划分数据后做了两种分类。我在考虑是否可以在第一次迭代期间迭代区域并按照我想要的顺序放置 Segments,但无法找到方法。

【问题讨论】:

    标签: c++ algorithm vector


    【解决方案1】:

    这一行

       for (std::vector<Segment>::reverse_iterator it = region.rbegin(); it != region.rend(); ++it){
    

    需要改成

       for (std::vector<Segment>::const_reverse_iterator it = region.rbegin(); it != region.rend(); ++it){
    

    因为region 是一个const 容器。因此,在 const 容器上调用 begin/rbegin/end/rend 将为这些容器返回 const_...iterator_type...

    但是,更好的是,使用auto 来简化。

    for(auto it = region.rbegin(); it != region.rend(); ++it)
    

    但是可以通过向前循环来修改整个第一个循环以加快速度

       for(auto const& value : region)
       {
          if(value.row > flipRow)
          {
             more.push_back(value);
          }
          else
          {
             less.push_back(value);
          }
       }
    

    最后一点。你算法的第一部分

        std::vector<Segment> vec, more, less;
        for (std::vector<Segment>::reverse_iterator it = region.rbegin(); it != region.rend(); ++it){
            if ((*it).row > flipRow){
                    more.insert(more.begin(), *it);
                }
            else{less.insert(less.begin(), *it);}
            };
        std::sort(more.begin(), more.end(), [](Segment const &a, Segment const &b){
            return a.row > b.row;
            });
        std::sort(less.begin(), less.end(), [](Segment const &a, Segment const &b){
            return a.row > b.row;
            });
        vec.insert(vec.end(), more.begin(), more.end());
        vec.insert(vec.end(), less.begin(), less.end());
    

    可以压缩成

       auto vec = region;
       std::sort(vec.begin(), vec.end(), [](Segment const& a, Segment const& b) {
          return a.row > b.row;
       });
    

    此渲染使用flipRow 已过时。如果您认为需要 那么实施中可能存在另一个缺陷。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多