在C ++中对模板类中的类成员进行排序

时间:2015-04-09 13:56:33

标签: c++ stl

我对C ++缺乏经验,在排序类型为“T”的向量时,我遇到了一个非常奇怪的问题,它是模板类中的类成员/属性。程序编译并运行,但对该属性调用“sort”确实正常工作:调用后根本没有订购。但是,我可以在方法中创建一个类型为T的局部向量,并且可以正确地进行有序排序。我究竟做错了什么?

我还提供了一个简单而快速的例子。这是模板类(TempClass.h):

#include <vector>
#include <stdio.h>
#include <algorithm>
#include <functional>

template <class T> class TempClass{
    public:
        TempClass(T a, T b, T c){
            container.clear();
            container.reserve(3);
            container[0] = a; container[1] = b; container[2] = c;
        }

        void modifyAttribute(){
            printf("Previous state:\n");
            for(int i = 0; i<3; i++){
                printf("[%d] -> %d\n", i, container[i].read());
            }
            sort(container.begin(), container.end(), std::greater<T>());
            printf("Final state:\n");
            for(int i = 0; i<3; i++){
                printf("[%d] -> %d\n", i, container[i].read());
            }
        }

        void testLocally(){
            std::vector<T> localContainer(3);
            localContainer[0] = T(14); localContainer[1] = T(97); localContainer[2] = T(42);
            printf("Previous state:\n");
            for(int i = 0; i<3; i++){
                printf("[%d] -> %d\n", i, localContainer[i].read());
            }
            sort(localContainer.begin(), localContainer.end(), std::greater<T>());
            printf("Final state:\n");
            for(int i = 0; i<3; i++){
                printf("[%d] -> %d\n", i, localContainer[i].read());
            }
        }

    private:
        std::vector<T> container;
};

可能的简单用法(Tester.cpp):

#include "TempClass.h"

class Value{
    public:
        Value(){
            this->val = 0;
        }

        Value(int val){
            this->val = val;
        }

        Value(const Value& reference){
            this-> val = reference.val;
        }

        bool operator >(const Value& other) const{
            printf("Ok...\n");
            return this->val > other.val;
        }

        int read(){
            return this->val;
        }

    private:
        int val;
};

int main(){
    TempClass<Value> object(Value(6), Value(17), Value(43));
    object.testLocally();
    object.modifyAttribute();
    return 0;
}

我真的不知道发生了什么:(非常感谢您的帮助。

此致

2 个答案:

答案 0 :(得分:1)

您似乎在调用reserve而不是resize,并在TempClass构造函数中超出界限。有关这两个函数的详细信息,请参阅this thread

除此之外它似乎有效,除非您使用的代码与您在此处发布的代码不同。

在旁注中,this->val是不必要的。只需使用val

答案 1 :(得分:-1)

当您调用container.reserve(3);时,会增加向量的容量(内部存储的大小),但向量仍为空。 operator[]不会插入元素,因此当您执行此操作时:

container.reserve(3);
container[0] = a; container[1] = b; container[2] = c;

您正在访问某些实际上不存在于向量中的元素,此后该向量仍为空。

执行所需操作的方法是resize(),这实际上会增加向量的大小。

您在testLocally方法中调用的构造函数设置了向量的初始大小,而不是它的初始容量,这就是为什么在该方法中它按预期工作的原因