我有一个向量向量,表示一个数组。我想高效地删除行(以最小的复杂度和分配)
我考虑过构建一个新的向量向量,只复制未删除的行,使用移动语义,如下所示:
//std::vector<std::vector<T> > values is the array to remove rows from
//std::vector<bool> toBeDeleted contains "marked for deletion" flags for each row
//Count the new number of remainin
在Cpp中,对象的“移动语义”指的是“移动而不是将对象复制到更新的对象”的概念,但是“语义”一词确实让我感到困惑。
“语义”和“功能”有什么区别?如何正确使用这个词?如果我意识到一种叫做" max (A,B)“的方法,我们能说”我实现了最大语义“吗?如果我编码一个名为"list“的对象,我们能说”我实现了序列存储语义“吗?
考虑到当今编译器在返回值优化方面的高质量( RVO和NRVO),我想知道开始添加移动构造函数和移动赋值操作符实际上有多大的类复杂性。
例如,对于这个really_trivial类,我只是假设在复制它的实例时,move语义不能提供比RVO和NRVO更多的东西:
class really_trivial
{
int first_;
int second_;
public:
really_trivial();
...
};
在这个semi_complex类中,我会毫不犹豫地添加一个移动构造函数和移动赋值操作符:
class semi_complex
{
s
我有下面的一套
//Create a set which orders the elements according to their size.
auto comp = [](const vector<int>& a, const vector<int>& b) -> bool
{
if (a.size() < b.size())
return true;
if (a.size() > b.size())
return false;
假设我们有一个包含非POD和POD部分的类。默认的是移动构造函数和移动分配。在移动之后,这个类的实例的POD部分是否可以安全使用?
#include <string>
struct A {
std::string s = "foo";
int i = 42;
};
A a;
A b = std::move(a);
int j = a.i; //OK or UB?
元素方式的移动/复制是有保证的(所以这是可以的)还是一致性实现可以改变POD部分(例如,通过与默认构造的对象交换)?
我了解如何移动对象,例如:
int a(5), b(6);
int c(std::move(a)); // move constructor
c = std::move(b); // move assignment
我理解自定义移动构造函数的常见实现(它获取动态指针的所有权,并将从指针移动到nullptr)。
但是,我还没有找到任何关于移动动态分配指针本身的信息。我需要确认以下代码是合法的:
int *p(new int(42));
int val(std::move(*p));
delete p; // I think this is no longer necessary. Is i
因此,我对move语义的理解是,它们允许您重写函数,以便使用临时值(Rvalue),并避免可能代价高昂的副本(方法是将状态从未命名的临时值移动到指定的lvalue中)。
我的问题是,为什么我们需要特殊的语义学呢?为什么C++98编译器不能删除这些副本,因为是编译器决定给定表达式是lvalue还是rvalue?例如:
void func(const std::string& s) {
// Do something with s
}
int main() {
func(std::string("abc") + std::string("def
我在C++11中读过一些关于移动语义的描述,我想知道它可以在什么上下文中使用。目前,许多C++数学库使用模板元编程来延迟计算。
如果M = A + B + C*D,其中M、A、B、C和D是矩阵,则模板元编程允许避免无用副本。移动语义是一种更方便的方式来做这类事情吗?
如果不是,在什么上下文中使用移动语义。如果是,与这种用途的模板元编程相比,有什么不同/限制?