内部移动std::vector元素和QVector
Internal moving std::vector elements and QVector
有两个向量std :: vector
和QVector
。我们必须检查插入元素时"移位"的方式。(是构造两个向量与五个元素和插入零元素)我有这个代码:
#include <QVector>
#include <QTextStream>
struct MoveTest
{
int i;
MoveTest() {}
MoveTest(const MoveTest& other) {QTextStream(stdout) << "constr copy" << endl;}
MoveTest(MoveTest &&other) {QTextStream(stdout) << "constr move" << endl;}
~MoveTest() {}
inline MoveTest& operator= (const MoveTest& other) {QTextStream(stdout) << "copy" << endl;}
inline MoveTest& operator= (MoveTest &&other) {QTextStream(stdout) << "move" << endl;}
};
int main(int argc, char *argv[])
{
QTextStream(stdout) << "std::move:" << endl;
MoveTest t1;
MoveTest t2(std::move(t1));
t1 = std::move(t2);
QTextStream(stdout) << "QVector:" << endl;
QVector<MoveTest> qmTest(5);
qmTest.insert(qmTest.begin(), MoveTest());
QTextStream(stdout) << "std::vector:" << endl;
std::vector<MoveTest> mTest(5);
mTest.insert(mTest.begin(), MoveTest());
return 0;
}
使用gcc 4.7.2时的输出,QMAKE_CXXFLAGS += -std=c++0x:
std::move:
constr move
move
QVector:
constr copy
constr copy
constr copy
constr copy
constr copy
constr copy
copy
copy
copy
copy
copy
copy
std::vector:
constr move
constr copy
constr copy
constr copy
constr copy
constr copy
如何插入元素与内部移位而不复制?需要哪些GCC标志?
因为你的移动操作符可以抛出一个异常,std::vector
不能使用它。如果操作符在调整大小过程的中途抛出异常,该怎么办?如果不能抛出异常,则声明为noexcept,并且vector实现可以使用它。
可能对某人有用。
struct MoveTest
{
int i;
MoveTest() {}
MoveTest(MoveTest&&) noexcept {std::cout << "constr moven";}
MoveTest(const MoveTest&) {std::cout << "constr copyn";}
~MoveTest() noexcept {}
MoveTest& operator= (MoveTest&&) noexcept {std::cout << "moven"; return *this;}
MoveTest& operator= (const MoveTest&) {std::cout << "copyn"; return *this;}
};
Q_DECLARE_TYPEINFO(MoveTest, Q_MOVABLE_TYPE);
int main(int argc, char *argv[])
{
std::cout << "std::move:n";
MoveTest t1;
MoveTest t2(std::move(t1));
MoveTest t3(std::move_if_noexcept(t2));
t2 = std::move(t3);
t1 = std::move_if_noexcept(t2);
std::cout << "n";
std::cout << "QVector:n";
QVector<MoveTest> qmTest(5);
qmTest.insert(qmTest.begin(), MoveTest());
std::cout << "n";
std::cout << "std::vector:n";
std::vector<MoveTest> mTest(5);
mTest.insert(mTest.begin(), MoveTest());
return 0;
}
:
std::move:
constr move
constr move
move
move
QVector:
constr copy
constr copy
std::vector:
constr move
constr move
constr move
constr move
constr move
constr move
QT中的容器肯定能够处理移动语义。运行下面的例子,自己看看。
#include <QCoreApplication>
#include <QVector>
#include <iostream>
struct MoveTest
{
int i;
MoveTest() {}
MoveTest(MoveTest&&) noexcept {std::cout << "constr moven";}
MoveTest(const MoveTest&) {std::cout << "constr copyn";}
~MoveTest() noexcept {}
MoveTest& operator= (MoveTest&&) noexcept {std::cout << "moven"; return *this;}
MoveTest& operator= (const MoveTest&) {std::cout << "copyn"; return *this;}
};
Q_DECLARE_TYPEINFO(MoveTest, Q_MOVABLE_TYPE);
int main(int argc, char *argv[])
{
std::cout << "std::move:n";
MoveTest t1;
MoveTest t2(std::move(t1));
MoveTest t3(std::move_if_noexcept(t2));
t2 = std::move(t3);
t1 = std::move_if_noexcept(t2);
std::cout << "n";
std::cout << "QVector:n";
QVector<MoveTest> qmTest;
int i=5;
while(i) {
qmTest.append(MoveTest());
--i;
}
std::cout << "n";
std::cout << "std::vector:n";
std::vector<MoveTest> mTest(5);
mTest.insert(mTest.begin(), MoveTest());
return 0;
}
由于两个对象具有相似的用途,这并不意味着所有成员函数都是相同的。检查下面的输出。:
std::move:
constr move
constr move
move
move
QVector:
constr move
constr move
constr move
constr move
constr move
std::vector:
constr move
constr move
constr move
constr move
constr move
constr move
Press <RETURN> to close this window...
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 将 Qvector<uint8_t> 转换为 QString
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 调用QVector::保留即使不知道确切的元素数量?
- 创建和访问指向 QObjects 的指针的 QVector 元素
- 如何使用 QVector at or operator[] 获取指向元素的指针
- 按内容访问QVector元素索引
- 内部移动std::vector元素和QVector