对向量中具有奇数索引的数字进行排序

Posted

技术标签:

【中文标题】对向量中具有奇数索引的数字进行排序【英文标题】:sort numbers which has odd-index in vector 【发布时间】:2015-01-09 16:52:31 【问题描述】:

我想对具有奇数索引的向量中的数字进行排序(索引从 0 开始)。

例如,如果我输入这个数字; 1 6 5 7 3 2 0,程序必须返回这个:1 2 5 6 3 7 0

我的代码

#include <iostream>
#include <vector>

using namespace std;

int main()

    int eded, n, _temp;
    size_t i;

    cout << "Nece eded daxil edeceksiniz?" << endl << ">>> ";
    cin >> n;

    vector<int> v_eded;
    v_eded.reserve(n); // n qeder bosh yer ayiriram vektor-da

    cout << "Ededleri daxil edin:" << endl;

    for (int i = 0; i < n; i++)
    
        cin >> eded;
        v_eded.push_back(eded);
    

    for (i = 1; i < v_eded.size(); i+=2)
    
        if (v_eded[i] > v_eded[i+2])
        
            _temp = v_eded[i+2];
            v_eded[i+2] = v_eded[i];
            v_eded[i] = _temp;
        
    

    for (auto j : v_eded)
        cout << j << " ";

    return 0;

编译时没有任何警告和/或错误。插入eded 后,我按下Enter 并且程序给了我这个错误:

我无法确定问题所在。请解释一下出了什么问题以及如何解决这个问题。

最好的问候。

【问题讨论】:

不清楚您所说的“我想对具有奇数索引(索引从 0 开始)的向量中的数字进行排序”是什么意思。但是,您看到的错误是因为您访问的索引超出了向量范围 按重试调试。 (休息时间应在if (v_eded[i] &gt; v_eded[i+2]))。 @coni 调试器应该已将您带到导致问题的行。 @coni 这些值是发生崩溃时这些变量的值。您确实看到表达式超出范围(i + 2)。此外,您编写了程序——您应该知道每一行应该做什么,因为您已经有了计划。您看到索引走得很远,对吗?所以我不知道(至少)告诉我们你知道问题是什么的困难,即使你不知道如何解决问题。 @coni - 你应该在编写代码之前计划好所有事情,并准备好调整(非工作)代码以适应你的计划,或者回去重新考虑/重做你的计划. 【参考方案1】:

你有越界访问权限

if (v_eded[i] > v_eded[i+2])

只有i &lt; v_eded.size(),而不是i + 2

【讨论】:

【参考方案2】:

这或多或少应该这样做:

    #include <boost/iterator_adaptors.hpp>

    using namespace std;

    template<class Iter>
    struct by_2_iterator
    : boost::iterator_adaptor<by_2_iterator<Iter>, Iter>
    
        by_2_iterator(Iter it, Iter limit)
        : by_2_iterator::iterator_adaptor_(it)
        , _limit(limit)
        

    private:

        struct enabler ;  // a private type avoids misuse
        friend class boost::iterator_core_access;

        void advance(typename by_2_iterator<Iter>::difference_type n)
        
            std::advance(this->base_reference(), n * 2);
        

        void increment()
        
            auto dist = _limit - this->base_reference();
            if (dist == 1) 
                ++(this->base_reference());
                _was_half = true;
            
            else 
                this->advance(1);
                _was_half = false;
            
        

        void decrement()
        
            if (_was_half) 
                --(this->base_reference());
                _was_half = false;
            
            else 
                this->advance(-1);
            
        

    private:
        Iter _limit;
        bool _was_half = false;
    ;

    template<class Iter>
    by_2_iterator<Iter>
    make_by_2(Iter it, Iter e) 
        return by_2_iterator<Iter>(it, e);
    


    BOOST_AUTO_TEST_CASE(play_2sort)
    

        std::vector<int> v  1, 6, 5, 7, 3, 2, 0 ;

        auto b = make_by_2(begin(v)+1, end(v));
        auto e = make_by_2(end(v), end(v));

        std::sort(b, e);

        std::copy(begin(v), end(v), ostream_iterator<int>(cout, ", "));
        cout << endl;



    

【讨论】:

感谢关注。但是,我没有这个级别的知识。所以,我不知道如何使用这些代码来解决我的问题。【参考方案3】:

我刚刚编辑了我的代码并使用了简单的*select sort* 算法。

#include <iostream>
#include <vector>

using namespace std;

int main()

    int eded, n, _temp, min_i;
    size_t i, j;

    cout << "Nece eded daxil edeceksiniz?" << endl << ">>> ";
    cin >> n;

    vector<int> v_eded;
    v_eded.reserve(n); // n qeder bosh yer ayiriram vektor-da

    cout << "Ededleri daxil edin:" << endl;

    for (int i = 0; i < n; i++)
    
        cin >> eded;
        v_eded.push_back(eded);
    

    for (i = 1; i <= n; i += 2) // or you can replace " n " with v_eded.size()
    
        min_i = i;
        for (j = i; j < n; j += 2)
        
            if (v_eded[j] < v_eded[min_i])
                min_i = j;

            _temp = v_eded[i];
            v_eded[i] = v_eded[min_i];
            v_eded[min_i] = _temp;
        
    

    cout << endl << endl;
    for (auto v : v_eded)
        cout << v << "  ";

    return 0;

谢谢。

【讨论】:

以上是关于对向量中具有奇数索引的数字进行排序的主要内容,如果未能解决你的问题,请参考以下文章

C++ 按索引对向量进行排序

对向量矩阵中的值进行排序,输出对应的索引

对向量元素进行排序[关闭]

R语言使用sort.list函数对向量数据进行排序(默认升序排序)返回排序后的对应索引值

使用不同方式对具有数字索引的data.table列进行子集化时的结果不同

分段错误11:在这种排序和搜索问题中