对向量中具有奇数索引的数字进行排序
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] > v_eded[i+2])
)。
@coni 调试器应该已将您带到导致问题的行。
@coni 这些值是发生崩溃时这些变量的值。您确实看到表达式超出范围(i + 2
)。此外,您编写了程序——您应该知道每一行应该做什么,因为您已经有了计划。您看到索引走得很远,对吗?所以我不知道(至少)告诉我们你知道问题是什么的困难,即使你不知道如何解决问题。
@coni - 你应该在编写代码之前计划好所有事情,并准备好调整(非工作)代码以适应你的计划,或者回去重新考虑/重做你的计划.
【参考方案1】:
你有越界访问权限
if (v_eded[i] > v_eded[i+2])
只有i < 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;
谢谢。
【讨论】:
以上是关于对向量中具有奇数索引的数字进行排序的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用sort.list函数对向量数据进行排序(默认升序排序)返回排序后的对应索引值