c ++ push_back第一个向量和按升序排序向量[关闭]

Posted

技术标签:

【中文标题】c ++ push_back第一个向量和按升序排序向量[关闭]【英文标题】:c++ pushback first vector and sorting vectors by ascending order [closed] 【发布时间】:2016-08-02 17:45:14 【问题描述】:

我正在尝试对第一个向量进行排序 向量 l[0] 是 x1 的点,那么它的长度总是变化的

vector<int> v1;
v1.push_back(l[0]);
vector<int>::iterator Iter = v1.begin();
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
sort(v1.begin(), v1.end());
cout << *Iter << endl;

它没有任何错误,但不能按顺序排序。我该如何解决?

编辑---------------------------------------------- ------------------------------

void thresh_callback(int, void*)


    /// Load source image and convert it to gray
    src = imread(img_file, 1);

    Mat threshold_output;
    Mat threshold_output1;
    Mat dst;
    vector<vector<Point> > contours;

    /// Detect edges using Threshold
    Canny(src_hist, threshold_output, thresh, thresh * 3, 3, false);
    Sharpen(threshold_output, threshold_output1);


    cvtColor(threshold_output1, dst, CV_GRAY2BGR);

    vector<Vec4i> lines;
    HoughLinesP(threshold_output1, lines, 1, CV_PI / 180, thresh1, min_line, max_gap);

    int erosion_size = 1;
    Mat element = getStructuringElement(MORPH_ERODE,
        Size(2 * erosion_size + 1, 2 * erosion_size + 1),
        Point(erosion_size, erosion_size));

    /// Apply the erosion operation
    dilate(dst, dst, element);

    imshow("Source", dst);

    for (size_t i = 0; i < lines.size(); i++)
    
        Vec4i l = lines[i];
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        int dx = l[2] - l[0];
        int dy = l[3] - l[1];

        double rad = atan2(dx, dy);
        double degree = (rad * 180) / M_PI;

        if (degree >= 180) degree -= 180;
        if (degree < 15 || degree > 165) 
            line(src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 1, 8);
            //printf("%lf\n", degree);
            //printf("%d, %d, %d, %d, %d\n", l[0], l[1], l[2], l[3], i);

            vector<int> v1;
            v1.push_back(l[0]);
            vector<int>::iterator Iter = v1.begin();
            sort(v1.begin(), v1.end());
            for (Iter = v1.begin(); Iter != v1.end(); Iter++)
                cout << *Iter << endl;
            
        
        imshow("source", src);
    


我使用 houghline 并找出 x1,x2,y1,y2 的点 并获取每个 x1 并按升序排序

【问题讨论】:

很抱歉,您想做什么还不清楚。 另外,为什么要使用像l 这样的单字母变量名?它看起来像1 for (Iter = v1.begin(); Iter != v1.end();) 无限循环?你是说for (Iter = v1.begin(); Iter != v1.end(); ++Iter) 照原样,在您修复所有拼写错误以便它像下面的@VaibhavBajaj 答案那样实际编译后,您将排序一个int,因为这就是您的所有push_backv1。你真正想要排序的是什么? 我们能有最小的编译程序来显示您遇到的问题吗?您问题中的代码示例缺少可能对发现问题很重要的周边信息。 【参考方案1】:

不确定这是您的问题,但是...您在 for 循环中定义了 v1

for (size_t i = 0; i < lines.size(); i++)

  // ...

        vector<int> v1;
        v1.push_back(l[0]);
        vector<int>::iterator Iter = v1.begin();
        sort(v1.begin(), v1.end());
        for (Iter = v1.begin(); Iter != v1.end(); Iter++)
            cout << *Iter << endl;
        
  // ...

因此,您每次迭代都创建一个向量,插入单个元素,对向量进行排序(使用单个元素),打印单个值并销毁该向量。

建议:在for 循环之外定义v1

--- 编辑---

正如 aichao 所指出的,排序和打印部分在 for 循环之外可能更好;像

vector<int> v1;

for (size_t i = 0; i < lines.size(); i++)

  // ...

        v1.push_back(l[0]);

  // ...


sort(v1.begin(), v1.end());

for ( vector<int>::const_iterator CIter = v1.cbegin(); CIter != v1.cend(); CIter++) 
   cout << *CIter << endl;

如果能编译C++11或者C++14,最后一个for就可以简单了

for ( auto const & i : v1 )
   cout << i << endl;

ps:对不起,我的英语不好。

【讨论】:

@plzunderstandmyenglish 请理解他的英语。 @max66:也许您可以编辑它,以便将 v1 定义 sort 和后续输出移到 for 循环之外? @max66 谢谢,我会试试的 @aichao - 你是对的;根据它修改了我的答案。 @plzunderstandmyenglish - 修改了我的答案以遵循 aichao 的建议

以上是关于c ++ push_back第一个向量和按升序排序向量[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我如何按类属性对C++向量数组进行排序[重复]

2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成

用 C++ 在给定的未排序序列中找到第一个最长的升序或降序子序列

C++ 冒泡排序升序 - 不对所有元素进行排序

如何在与用户给定前缀匹配的字符串向量中找到第一个单词?

代码中的c ++ 2D向量push_back错误