我对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;
}
我真的不知道发生了什么:(非常感谢您的帮助。
此致
答案 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
方法中调用的构造函数设置了向量的初始大小,而不是它的初始容量,这就是为什么在该方法中它按预期工作的原因