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

Sorting class members in a template class in C++

我在 C++ 方面经验不足,在对模板 class member/attribute 类型 "T" 的向量进行排序时遇到一个非常奇怪的问题=].该程序编译并 运行 但对该属性调用 "sort" 确实可以正常工作:调用后根本没有排序。但是,我可以在一个方法中创建一个 T 类型的局部向量,并正确地对 ir 进行排序。我究竟做错了什么?

我还提供了一个这种情况的简单快速示例。这是模板 class (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;
}

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

此致

看起来你正在调用 reserve 而不是 resize 并且在你的 TempClass 构造函数中越界了。有关这两个函数的更多详细信息,请参阅 this thread

除此之外,它似乎可以正常工作,除非您使用的代码与您在此处发布的代码不同。

附带说明,this->val 是不必要的。只需使用 val.

当您调用 container.reserve(3); 时,您增加了向量的容量(内部存储的大小),但向量仍然是空的。 operator[] 不插入元素,所以当你这样做时:

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

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

做你想做的事情的方法是 resize(),它实际上增加了矢量的大小。

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