[英]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標志?
由於您的move運算符可以引發異常,因此std::vector
不能使用它。 如果操作員在調整大小過程中途拋出異常,該怎么辦? 如果它不能引發異常並且vector實現可以使用它,則將其聲明為noexcept 。
可能對某人有用。
struct MoveTest
{
int i;
MoveTest() {}
MoveTest(MoveTest&&) noexcept {std::cout << "constr move\n";}
MoveTest(const MoveTest&) {std::cout << "constr copy\n";}
~MoveTest() noexcept {}
MoveTest& operator= (MoveTest&&) noexcept {std::cout << "move\n"; return *this;}
MoveTest& operator= (const MoveTest&) {std::cout << "copy\n"; 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 move\n";}
MoveTest(const MoveTest&) {std::cout << "constr copy\n";}
~MoveTest() noexcept {}
MoveTest& operator= (MoveTest&&) noexcept {std::cout << "move\n"; return *this;}
MoveTest& operator= (const MoveTest&) {std::cout << "copy\n"; 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...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.