打乱QList的部分

Shuffle parts of a QList

本文关键字:QList 打乱      更新时间:2023-10-16

我有一个列表,我想在这个列表中进行3次不同的洗牌,如下所示:

  • 1º洗牌:前十项
  • 2º洗牌:从第11项到第20项
  • 3º洗牌:从第21项到最后

这就是我目前所做的:

QList<QString> list;
list << "a" << "b" << ...
    std::random_shuffle(list.begin(), list.begin()+10);
    list.takeFirst();
    QString shuffle1 = list.takeFirst();
    std::random_shuffle(list.begin()+11, list.begin()+20);
    list.takeFirst();
    QString shuffle2 = list.takeFirst();
    std::random_shuffle(list.begin()+21, list.end());
    list.takeFirst();
    QString shuffle3 = list.takeFirst();enter code here

但它不起作用。有什么想法吗?提前感谢!

我不知道为什么在忽略第一个的同时去掉两个项目,但我认为主要问题是,您试图用项目完整的逻辑进行混洗,而在混洗调用之间调用list.takeFirst()时实际上删除了项目。因此,洗牌将不再像你所期望的那样对原作起作用。

以下是一些修复此问题的示例代码:

main.cpp

#include <QStringList>
#include <QDebug>
#include <algorithm>
int main()
{
    // You better generate this test data for 30 items...
    QStringList stringList{"a1", "b2", "c3", "d4", "e5", "f6"};
    static const int sliceSize = 2;
    for (int i = 0; i < stringList.size(); i+=sliceSize) {
        std::random_shuffle(stringList.begin() + i, stringList.begin() + (i+sliceSize-1));
        qDebug() << stringList.mid(i, sliceSize);
    }
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
CONFIG += c++11
SOURCES += main.cpp

构建并运行

qmake && make && ./main

输出

("a1", "b2")
("c3", "d4")
("e5", "f6")