嘿,我正在尝试将给定的输入排序为wave数组。
给出一个整数数组,将该数组排序为类似wave的wave并将其返回, 换句话说,将元素排列为a1> = a2 <= a3> = a4 <= a5 .....
给出[1、2、3、4]
一个可能的答案:[2,1,4,3]
另一个可能的答案:[4,1,3,2]
vector<int> Solution::wave(vector<int> &A) {
int size = A.size();
for (int i=0; i < size ; i++)
{
int min =0;
sort(A.begin(),A.end());
for (auto it = A.begin(); it != A.end(); it++) {
if(A[it+1]>A[it])
{
int temp=0;
temp = A[it+1];
A[it+1]=A[it];
A[it]=temp;
}
}
}
}
}
错误:-
solution.cpp: In member function 'std::vector<int> Solution::wave(std::vector<int>&)':
solution.cpp:8:13: error: no match for 'operator[]' (operand types are 'std::vector<int>' and '__gnu_cxx::__normal_iterator<int*, std::vector<int> >')
if(A[it+1]>A[it])
^
solution.cpp:8:13: note: candidates are:
In file included from /usr/include/c++/4.8/vector:64:0,
from solution.h:13,
from solution.cpp:-3:
/usr/include/c++/4.8/bits/stl_vector.h:770:7: note: std::vector<_Tp, _Alloc>::reference std::vector<_Tp, _Alloc>::operator[](std::vector<_Tp, _Alloc>::size_type) [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::reference = int&; std::vector<_Tp, _Alloc>::size_type = long unsigned int]
operator[](size_type __n)
^
/usr/include/c++/4.8/bits/stl_vector.h:770:7: note: no known conversion for argument 1 from '__gnu_cxx::__normal_iterator<int*, std::vector<int> >' to 'std::vector<int>::size_type {aka long unsigned int}'
/usr/include/c++/4.8/bits/stl_vector.h:785:7: note: std::vector<_Tp, _Alloc>::const_reference std::vector<_Tp, _Alloc>::operator[](std::vector<_Tp, _Alloc>::size_type) const [with _Tp = int; _Alloc = std::allocator<int>; std::vector<_Tp, _Alloc>::const_reference = const int&; std::vector<_Tp, _Alloc>::size_type = long unsigned int]
operator[](size_type __n) const
^
答案 0 :(得分:2)
访问向量的元素时,可以使用迭代器:
for( auto it = v.begin(); it != v.end(); ++it )
std::cout << *it;
或索引:
for( size_t i = 0; i != v.size(); ++i )
std::cout << v[i];
选择一个,不要混合。
注意:有std::swap()
功能,您无需手动完成
答案 1 :(得分:1)
A.begin()返回指向向量开头的迭代器,因此您可以使用* A.begin()访问该元素。
因此,在这种情况下A [it + 1]毫无意义。
答案 2 :(得分:1)
C ++中的迭代器是对容器中某个位置的某种引用的包装。 it
不是整数,但是在这种情况下,vector<int>
,it
是指整数。
因此it
不能用作下标索引,但是*it
可以用作下标索引。
在
if(A[it+1]>A[it])
it+1
不能解析为it
加1的数字,它解析为it
之后的vector元素的迭代器。您可能打算写
if(A[*(it+1)]>A[*it])
打破现状,
it+1
:在it
之后的参考元素。让我们将此元素称为1 *(it+1)
:在it
之后的元素处获取值。跟随从
上面与A[1]
相同,假设A[1]
处的值
是42。A[*(it+1)]
:是A[A[1]]
或A[42]
这将编译,但不会执行您尝试执行的操作。
相反,您可能想直接比较整数。
if(*(it+1)>*it)
以及代码中A[it]
的所有后续变体。
这将允许您调试算法中的其他问题,我将不予解决,因为这看起来像是某种作业或挑战。
除此之外:
for (auto it = A.begin(); it != A.end(); it++)
允许it
的范围从vector
的开始到结尾,并且需要额外的防护,以使*(it+1)
到达时不能超过vector
的结尾vector
的末尾。您可以
for (auto it = A.begin(); it != A.end() - 1; it++)
但是,如果您四处寻找,可能会找到更好的选择。
答案 3 :(得分:1)
您的循环存在一些问题。
它是一个迭代器。要获得它的值是* it,它的内容+1是*(it + 1)。
您的循环应仅使用size-1,否则您将比较最后一个值和无效值。
std :: swap()将比手动编码交换更有效,因为它将使用移动而不是复制。
您可能打算将循环增加2,以便在for循环中使其+ = 2。
您应该检查奇数长度并采取适当的措施。
迈克