Qt编程:c++模版编程与高效使用QList容器

#include <iostream>

using namespace std;

template<typename T>

class PrintEverything{

private:
    T data;
public:
    void printInt(){
        cout << data << endl;
    };
    void setInt(T data){
        this->data = data;
    };

};

class PrintInt{
private:
    int data;
public:
    void printInt();
    void setInt(int data);
};

void PrintInt::printInt(){
    cout << data << endl;
}
void PrintInt::setInt(int data){
    this->data = data;
}

class PrintString{
private:
    string str;
public:
    void printString();
    void setString(string str);
};

void PrintString::printString(){
    cout << str << endl;
}
void PrintString::setString(string str){
    this->str = str;
}

int main()
{
    PrintInt p1;
    p1.setInt(10);
    p1.printInt();
    PrintString p2;
    p2.setString("leihoua");
    p2.printString();
    PrintEverything<int> p3;
    p3.setInt(100);
    p3.printInt();
    PrintEverything<string> p4;
    p4.setInt("mobanshiyan");
    p4.printInt();

    cout << "Hello World!" << endl;
    return 0;
}

你的代码中存在一些问题,主要是与模板类PrintEverything有关。具体来说:

  1. 在模板类PrintEverything中,你定义了printIntsetInt方法,但这些方法名可能引起混淆,因为它们暗示了只能打印整数或设置整数,而实际上这个类是通用的,可以处理任何类型。因此,方法名应该更具通用性。
  2. 当使用PrintEverything<string>时,你调用了setIntprintInt方法,并传递了一个字符串参数,这会导致编译错误,因为这两个方法的名字不符合预期用途。

下面是修正后的代码:

#include <iostream>
#include <string>

using namespace std;

template<typename T>
class PrintEverything{
private:
    T data;
public:
    // 更改方法名为更通用的形式
    void printData(){
        cout << data << endl;
    }
    void setData(T data){
        this->data = data;
    }
};

class PrintInt{
private:
    int data;
public:
    void printInt();
    void setInt(int data);
};

void PrintInt::printInt(){
    cout << data << endl;
}
void PrintInt::setInt(int data){
    this->data = data;
}

class PrintString{
private:
    string str;
public:
    void printString();
    void setString(string str);
};

void PrintString::printString(){
    cout << str << endl;
}
void PrintString::setString(string str){
    this->str = str;
}

int main()
{
    PrintInt p1;
    p1.setInt(10);
    p1.printInt();

    PrintString p2;
    p2.setString("leihoua");
    p2.printString();

    PrintEverything<int> p3;
    p3.setData(100); // 使用通用方法名
    p3.printData();

    PrintEverything<string> p4;
    p4.setData("mobanshiyan"); // 使用通用方法名
    p4.printData();

    cout << "Hello World!" << endl;
    return 0;
}

主要修改点包括:

  • PrintEverything中的printIntsetInt方法重命名为printDatasetData,以反映其通用性质。
  • 在主函数中相应地更改了对这些方法的调用,以匹配新的名称。

这样,代码不仅更加清晰,而且能够正确运行并按照预期输出数据。

3.6.8.1 QList

 Qt 框架中, QList 是一个容器类,它在内部实现上类似于一个数组,但也提供了一些链表的特性。

QList 的设计旨在提供一个在多数情况下既高效又方便的通用列表容器。用于存储元素列表。它提供了

丰富的功能,包括添加、移除、访问元素等。

QList 的内部工作原理:

1. 数组式存储QList 在大多数情况下使用连续内存存储其元素,类似于数组。这意味着它提供了快

速的索引访问(通过下标操作符 [] ),以及相对高效的迭代性能。

2. 动态调整大小:与静态数组不同, QList 可以动态增长和缩减,自动管理内存分配。

3. 链表特性:虽然 QList 主要基于数组,但它也提供了一些链表的操作,比如在列表的开始或结束

处添加和移除元素。这些操作通常比在数组中间插入或删除元素更高效。

4. 复制时共享内存QList 使用一种称为隐式共享implicit sharing)或写时复制copy-on

write)的技术。这意味着当你复制一个 QList 时,它不会立即复制所有元素,而是共享相同的数

据,直到你尝试修改其中一个列表,此时才进行实际的复制。这使得复制 QList 变得非常高效。

使用场景:

当你需要快速的随机访问(如通过索引访问元素)时, QList 是一个不错的选择。

如果你的主要操作是在列表的两端添加或移除元素, QList 也表现得很好。

基本用法

包含头文件:首先,你需要包含 QList 的头文件。

#include <QList>

创建 QList 实例:创建一个 QList 对象,并指定存储的元素类型。

QList<int> list;

添加元素:使用 append push_back 方法添加元素。

list.append(1);
list.append(2);
list.append(3);

this->setWindowTitle(fileName + "- MyNoteBook");

QList<QTextEdit::ExtraSelection> extraSelections;

void setExtraSelections(const QList<QTextEdit::ExtraSelection> &extraSelections)

访问元素:可以使用下标操作符或 at() 方法访问元素。

遍历列表:使用迭代器或范围基的 for 循环遍历列表。

移除元素:使用 removeAt removeOne clear 方法移除元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

范纹杉好好生活工作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值