сортировать числа с нечетным индексом в векторе

Я хочу отсортировать числа в векторе, который имеет нечетный индекс (индекс начинается с 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 и программа выдает мне эту ошибку:

введите описание изображения здесь

Я не мог определить, в чем проблема. Пожалуйста, объясните мне, что не так и как это решить.

С наилучшими пожеланиями.

2

Решение

У вас есть доступ из

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

где только i < v_eded.size()не i + 2

1

Другие решения

это должно более или менее сделать это:

    #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;}
1

Я только что отредактировал свой код и использовал простой *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;
}

Благодарю.

0
По вопросам рекламы [email protected]