简体   繁体   English

对环形缓冲区 class 对象进行排序

[英]Sorting a ring buffer class objects

I am trying to make a sorting function for a ring buffer class object, but it gives me the below error and I couldn't remove it:我正在尝试对环形缓冲区 class object 进行排序 function,但它给了我以下错误,我无法删除它:

template placeholder type 'ring' must be followed by a simple declarator-id模板占位符类型 'ring' 必须后跟一个简单的 declarator-id

argument list for class template "ring" is missing class 模板“环”的参数列表丢失

'arr' was not declared in this scope此 scope 中未声明“arr”

(arr) was declared in the parameter of the function but yet it does not recognize it (arr) 在 function 的参数中声明但它无法识别它

hopefully someone can explain what is wrong with the sorting function, here is below my code:希望有人可以解释排序 function 有什么问题,下面是我的代码:

#include<iostream>
#include<initializer_list>
template<typename T>
void swap(T& x, T& y) {
    T temp;
    temp = x;
    x = y;
    y = temp;
}

template<typename T>
class ring {

public:
    class iterator;

public:
    ring(std::initializer_list<T>elements) {
        sze = elements.size();
        value = new T[sze];
        for (auto& i : elements) {
            add(i);
        }
    }

    T& get(int x) { return value[x]; }

    std::size_t size() { return sze; }

    void add(T v) {
        value[index++] = v;
        if (index == sze)
            index = 0;
    }
    iterator begin() { return iterator(0, *this); }
    iterator end() { return iterator(sze, *this); }

    friend void BubbleSort(ring& arr, std::size_t n);

    ~ring() { delete[] value; }

private:
    int index = 0;
    std::size_t sze;
    T* value;
    };

template<typename T>
class ring<T>::iterator {
public:

    iterator(int x, ring& y) :index(x), obj(y) {}
    iterator& operator++() { index++; return *this; }
    iterator& operator++(int x) { index++; return *this; }
    bool operator!=(const iterator& other) { return index != other.index; }
    T& operator*() { return obj.get(index); }

private:
    int index;
    ring& obj;
};
template<typename T>
void BubbleSort(ring& arr, std::size_t n) { // here is the function of the sorting.
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr.value[j] > arr.value[j + 1]) {
                swap(arr.value[j], arr.value[j + 1]);
            }
        }
    }
}

Your friendly compiler showed you already the problem and in which line it happened.您友好的编译器已经向您展示了问题以及它发生在哪一行。

And it gave you 3 error messages telling you exactly what the problem is.它给了你 3 条错误消息,告诉你到底是什么问题。

See my compiler output看我的编译器 output 在此处输入图像描述

Your class ring needs a template parameter.您的 class 环需要一个模板参数。 So same as in line 49 of the picture.与图片的第 49 行相同。

The below will compile.下面将编译。

#include<iostream>
#include<initializer_list>
template<typename T>
void swap(T& x, T& y) {
    T temp;
    temp = x;
    x = y;
    y = temp;
}

template<typename T>
class ring {

public:
    class iterator;

public:
    ring(std::initializer_list<T>elements) {
        sze = elements.size();
        value = new T[sze];
        for (auto& i : elements) {
            add(i);
        }
    }

    T& get(int x) { return value[x]; }

    std::size_t size() { return sze; }

    void add(T v) {
        value[index++] = v;
        if (index == sze)
            index = 0;
    }
    iterator begin() { return iterator(0, *this); }
    iterator end() { return iterator(sze, *this); }

    friend void BubbleSort(ring& arr, std::size_t n);

    ~ring() { delete[] value; }

private:
    int index = 0;
    std::size_t sze;
    T* value;
    };

template<typename T>
class ring<T>::iterator {
public:

    iterator(int x, ring& y) :index(x), obj(y) {}
    iterator& operator++() { index++; return *this; }
    iterator& operator++(int x) { index++; return *this; }
    bool operator!=(const iterator& other) { return index != other.index; }
    T& operator*() { return obj.get(index); }

private:
    int index;
    ring& obj;
};
template<typename T>
void BubbleSort(ring<T>& arr, std::size_t n) { // here is the function of the sorting.
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr.value[j] > arr.value[j + 1]) {
                swap(arr.value[j], arr.value[j + 1]);
            }
        }
    }
}

I did not check the functionality.我没有检查功能。 Sorting a ringbuffer sounds somehow strange.对环形缓冲区进行排序听起来有些奇怪。 . . . .

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM