【问题标题】:Remove all elements in QJsonArray删除 QJsonArray 中的所有元素
【发布时间】:2017-07-11 11:14:40
【问题描述】:

我想从 QJsonArray 中删除所有元素,但遇到的麻烦比我想象的要多。这是我的代码:

void Assessment::clearQJsonArray(QJsonArray *array) {
  printQJsonArray(*array);
  for(int i=0;i<array->count();i++) {
      array->removeAt(i);
  }

  qDebug() << "Test clear:" << array->count();

  printQJsonArray(*array);
}

void Assessment::printQJsonArray(QJsonArray array) {
  QJsonDocument doc;
  doc.setArray(array);
  qDebug() << doc.toJson();
}

void Assessment::testClearQJsonArray() {
QJsonArray array;
QJsonObject obj1, obj2, obj3, obj4;

obj1.insert("number",1);
obj2.insert("number",2);
obj3.insert("number",3);
obj4.insert("number",4);

array.append(obj1);
array.append(obj2);
array.append(obj3);
array.append(obj4);

qDebug() << "Before clear";
qDebug() << "Test size:" << array.count();

QJsonObject element;

for(int i=0;i<array.count();i++) {
    element = array.at(i).toObject();
    qDebug() << element.value("number").toInt();
}

clearQJsonArray(&array);
qDebug() << "After clear";

for(int i=0;i<array.count();i++) {
    element = array.at(i).toObject();
    qDebug() << element.value("number").toInt();
}
qDebug() << "Test size:" << array.count();
}

我得到了这个输出:

(void Assessment::testClearQJsonArray()): Before clear
(void Assessment::testClearQJsonArray()): Test size: 4
(void Assessment::testClearQJsonArray()): 1
(void Assessment::testClearQJsonArray()): 2
(void Assessment::testClearQJsonArray()): 3
(void Assessment::testClearQJsonArray()): 4
(void Assessment::printQJsonArray(QJsonArray)): "[\n    {\n        \"number\": 1\n    },\n    {\n        \"number\": 2\n    },\n    {\n        \"number\": 3\n    },\n    {\n        \"number\": 4\n    }\n]\n"
(void Assessment::clearQJsonArray(QJsonArray*)): Test clear: 2
(void Assessment::printQJsonArray(QJsonArray)): "[\n    {\n        \"number\": 2\n    },\n    {\n        \"number\": 4\n    }\n]\n"
(void Assessment::testClearQJsonArray()): After clear
(void Assessment::testClearQJsonArray()): 2
(void Assessment::testClearQJsonArray()): 4
(void Assessment::testClearQJsonArray()): Test size: 2

我真的不明白为什么要删除对象 1 和 3,而不是 2 和 4。有什么想法吗?

谢谢。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    您的代码:

    for(int i=0;i<array->count();i++) {
        array->removeAt(i);
    }
    

    你在这里做错了。应该是:

     for(int i=0; i<array->count(); i++) {
         array->removeAt(0);
     }
    

     while(array->count()) {
         array->pop_back();
     }
    

    想想你的循环做了什么:它删除了 0 索引处的第一个元素。在removeAt 调用后,您的数组立即缩小并左移一步。第一个索引变为 0,第二个变为第一个,依此类推。因此,在下一次迭代中,当您的 i 变为 1 时,它实际上指向前 2。因此您将删除第 1 和第 3 个元素,第 2 和第 4 个元素将被 i++ 跳过。

    这就是你删除的样子(^ 是一个i 指针):

    |0|1|2|3|
     ^
    
    |1|2|3|
       ^
    
    |1|3|
         ^
    

    【讨论】:

    • *array = QJsonArray{}; 怎么样?
    • @nwp 是的,这绝对应该有效。关键是问题实际上与QJsonArray 无关,而是与任何这样的容器有关。并且程序员应该了解为什么 上面的代码是不正确的,以避免将来出现此类错误。奇怪的是 QJsonArray 没有 clear() 这样的东西,所以你的变体是这种情况下最短的。
    • @nwp 但它不会导致内存泄漏吗?
    • @highvoltage379 不应该。如果它确实将其报告为错误。
    【解决方案2】:

    如果你使用过pointer

    *array = QJsonArray();
    

    而且,如果你有一个简单的 QJsonArray 对象:

    array = QJsonArray();
    

    【讨论】:

      【解决方案3】:

      答案中的while循环是正确的,但两个for循环都是错误的。问题是你的循环每次通过循环都会增加 i ,而 array->count() 每次通过循环都会减少。这会导致它们在中间相遇,因此您只删除了数组中的一半元素。要解决此问题,您可以使用变量。

       int len=array->count();
       for(int i=0; i<len; i++) {
           array->removeAt(0);
       }
      

      或者更好的是,只需使用 while 循环。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2020-08-29
        相关资源
        最近更新 更多