c++ - 移除 QJsonArray 中的所有元素

标签 c++ qt

我想从 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。有什么想法吗?

谢谢。

最佳答案

您的代码:

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,第二个变为 1,依此类推。因此,在下一次迭代中,当您的 i 变为 1 时,它实际上指向前一个 2。因此您将删除第 1 个和第 3 个元素,第 2 个和第 4 个元素将被 i++ 跳过。

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

|0|1|2|3|
 ^

|1|2|3|
   ^

|1|3|
     ^

关于c++ - 移除 QJsonArray 中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45032978/

相关文章:

c++ - 如何修复 Mujoco CmakeLists 构建错误 "/usr/bin/ld: cannot find -lglfw"?

c++ - move map 的构造函数

c++ - 如何观看多个QFuture?

c - Qt Creator纯C项目

qt - QML 动态列宽

c++ - 值得花时间学习 Qt (c++) 吗?

c++ - 在 C++ 中使用 std::vector 进行逃逸分析

c# - 如何从此数组中检索信息?

c++ - sprintf/格式化字符串可以直接传递给函数吗?

c++ - 如果 child 调整大小,让 QWidget 和 QVBoxLayout 自动调整大小(Qt4)