今日これにだいぶ時間を取られてしまったので備忘録としてとっておく
この中で唯一意図しない挙動を起こすものはどれだろうか?
// 各種コンテナから int の配列にコピーする処理を実装するテスト
quint32 stack[3];
// QList
QList<int> list;
list << std::numeric_limits<quint8>::max()
<< std::numeric_limits<quint16>::max()
<< std::numeric_limits<quint32>::max();
memcpy(&stack[0], &list[0], sizeof(stack));
qDebug() << stack[0] << stack[1] << stack[2];
// QVector
QVector<int> vector;
vector << std::numeric_limits<quint8>::max()
<< std::numeric_limits<quint16>::max()
<< std::numeric_limits<quint32>::max();
memcpy(&stack[0], &vector[0], sizeof(stack));
qDebug() << stack[0] << stack[1] << stack[2];
// std::vector
std::vector<int> sv;
sv.push_back(std::numeric_limits<quint8>::max());
sv.push_back(std::numeric_limits<quint16>::max());
sv.push_back(std::numeric_limits<quint32>::max());
memcpy(&stack[0], &sv[0], sizeof(stack));
qDebug() << stack[0] << stack[1] << stack[2];
// QVarLengthArray
QVarLengthArray<int> va;
va.append(std::numeric_limits<quint8>::max());
va.append(std::numeric_limits<quint16>::max());
va.append(std::numeric_limits<quint32>::max());
memcpy(&stack[0], &va[0], sizeof(stack));
qDebug() << stack[0] << stack[1] << stack[2];
答えは QList で、実行する度に値が変化する。よって、配列内の生データを直接取得したい場合は QList 以外のコンテナを使うこと。
QList と QVector はよく似ているが、使用するアルゴリズムが異なる(一番の違いは QList は prepend がおおよそ O(1) で完結する点)。Qt 的には前者を推奨している。
http://qt-project.org/doc/qt-4.8/qvector.html
http://qt-project.org/doc/qt-4.8/containers.html#algorithmic-complexity