【问题标题】: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 - 你应该在编写代码之前计划好所有事情,并准备好调整(非工作)代码以适应你的计划,或者回去重新考虑/重做你的计划.

标签: c++ sorting vector console-application windows-applications


【解决方案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;
    }
    

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多