无法遍历向量

时间:2018-08-15 16:29:08

标签: c++ vector stl

嘿,我正在尝试将给定的输入排序为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
   ^

来源:-https://www.interviewbit.com/problems/wave-array/

4 个答案:

答案 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])

打破现状,

  1. it+1:在it之后的参考元素。让我们将此元素称为1
  2. *(it+1):在it之后的元素处获取值。跟随从 上面与A[1]相同,假设A[1]处的值 是42。
  3. 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。

您应该检查奇数长度并采取适当的措施。

迈克