【问题标题】:How to use std functions in template?如何在模板中使用标准函数?
【发布时间】:2018-06-22 10:05:35
【问题描述】:

例如,如果我在模板类中有一个vector,那么我该如何对其进行排序,或者如何对向量进行迭代?因为我是这样尝试的:

#ifndef SAVEVIEW_H
#include <array>
#include <vector>

template<typename T>
class sorted_array_view {
public:
    sorted_array_view(T* array, size_t size) {
        append(array, size);
    }

    void append(T* array, size_t size) {
        for( int idx = 0; idx < size; ++idx)
        {
            std::cout << "value of array at " << idx <<": "<< array[idx] << std::endl;
            data.push_back(array[idx]);
        }
        sort(first(),last(), data);
    }

    T at(size_t index) const {
        return data[index];
    }

    size_t size() {
        return data.size();
    }

    const size_t size() const {
        return data.size();
    }

private:
    size_t first() {
        return data[0];
    }
    size_t last() {
        return data[data.size()-1];
    }
    void sort (sorted_array_view first, sorted_array_view last, std::vector<T>);
    std::vector<T> data;
};

#endif // SAVEVIEW_H

并用于: sort(first(),last(), data); 给我返回了这个错误:

error: no matching function for call to 'sorted_array_view<int>::sort(size_t, size_t, std::vector<int, std::allocator<int> >&)' 

任何想法,建议?谢谢!

【问题讨论】:

  • 能否请您发布所有代码? sort 是类还是函数的方法?
  • std::sort(data.begin(), data.end()); 您在访问函数上调用了 sort 函数,而 sort 接受迭代器。您的功能也可以用data.first()data.last() 实现。如果这确实有效(很难说,因为那不是完整的代码),请联系我,我会将其变成正确的答案。
  • @kortealma 如果在每次插入范围后重新排序,为什么不直接使用setmultiset?如果您想要的唯一操作是按顺序插入和迭代,那么它会更快,并且可以节省您编写整个类的时间。这看起来很像 XY 问题。您实际上想在这里完成什么?
  • 你的类(隐含地)声称是一个数组的view,而它实际上是一个copy。如果你的支持容器持有std::reference_wrapper&lt;T&gt;s,那么它就是一个view,事实上,它只是一个(坏的)multi_set
  • @Caleth 事实上,无论如何,在多集上制作这样的视图更容易 - Example。 (危险 - 仅用于说明。切勿使用!)

标签: c++ templates vector stl std


【解决方案1】:

std::sort 采用 random access iterators(例如向量迭代器或指针)。您将数字 (size_t) 作为输入。

#include <algorithm>
#include <vector>

void sortIt(std::vector<int> &vector) {
    std::sort(vector.begin(), vector.end());
}

你的类的 sort 方法的定义也与你所称的不同。

您声明它将sorted_array_view 按值作为前两个参数,然后将其传递给size_t,因为这是firstlast 方法返回的内容。

void sort (sorted_array_view first, sorted_array_view last, std::vector<T>);

我的建议是删除排序方法并将排序调用替换为对 std::sort 的调用,如下所示:

std::sort(data.begin(), data.end()); // was sort(first(),last(), data);

【讨论】:

  • 我试着按照你写的,只调用 std::sort 但这实际上没有对向量进行排序。我打印了它,矢量保持不变......
  • @korte alma:T 类型是什么?也许你需要一个不同的比较函数。
  • int, string
  • 向量保持不变还是你传入的T*?后者永远不会改变(尽管您的类被称为view),因为您正在对数据的副本(存储在vector)进行排序。
  • @korte alma:无论你做了什么,这可能不是std::sort 的错:coliru.stacked-crooked.com/a/fe8b556115f44740。请注意,字符串是根据字符的 ASCII 值按词法排序的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2011-09-30
相关资源
最近更新 更多