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