Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 原子变量向量(数组)_C++_Arrays_Vector_Atomic_Copy Constructor - Fatal编程技术网

C++ 原子变量向量(数组)

C++ 原子变量向量(数组),c++,arrays,vector,atomic,copy-constructor,C++,Arrays,Vector,Atomic,Copy Constructor,我知道atomic有一个被删除的复制构造函数,但是我该怎么做才能使这段代码正常工作呢?如何在原子的向量中定义复制构造函数 #include <atomic> #include <vector> int main() { std::vector<std::atomic<int>> examp; examp.resize(64); } std::atomic不可复制或移动。正如您所注意到的,复制构造函数将被删除,但不会生成移动构造函

我知道atomic有一个被删除的复制构造函数,但是我该怎么做才能使这段代码正常工作呢?如何在原子的向量中定义复制构造函数

#include <atomic>
#include <vector>

int main() {
    std::vector<std::atomic<int>> examp;
    examp.resize(64);
}
std::atomic不可复制或移动。正如您所注意到的,复制构造函数将被删除,但不会生成移动构造函数。见:

如果没有为类类型提供用户定义的移动构造函数 结构、类或联合,并且以下所有条件均为真:

没有用户声明的副本构造函数; “用户声明”表示编译器未添加,即默认情况下。即使它是一个库类,构造函数也是由用户声明的

向量的resize函数要求类型可以是move-insertable,也可以是copy-insertable,具体取决于重载。见:

如果当前大小小于计数

附加1个附加的默认插入元素

附加2份附加值

你所做的根本不起作用。

std::atomic不可复制或移动。正如您所注意到的,复制构造函数将被删除,但不会生成移动构造函数。见:

如果没有为类类型提供用户定义的移动构造函数 结构、类或联合,并且以下所有条件均为真:

没有用户声明的副本构造函数; “用户声明”表示编译器未添加,即默认情况下。即使它是一个库类,构造函数也是由用户声明的

向量的resize函数要求类型可以是move-insertable,也可以是copy-insertable,具体取决于重载。见:

如果当前大小小于计数

附加1个附加的默认插入元素

附加2份附加值


你所做的根本不起作用。

你不能有一个std::atomic的向量,因为它不可复制或移动,但你可以有一个到atomic的唯一ptr的向量。如果您确实需要原子的运行时可变大小向量,这可能是一个可行的替代方案。以下是一个例子:

#include <iostream>
#include <atomic>
#include <vector>
#include <memory>

using namespace std;

int main() {
    std::vector<std::unique_ptr<std::atomic<int>>> examp;
    examp.resize(64);   // 64 default unique_ptrs; they point to nothing

    // init the vector with unique_ptrs that actually point to atomics
    for (auto& p : examp) {
        p = std::make_unique<std::atomic<int>>(0);   // init atomic ints to 0
    }

    // use it
    *examp[3] = 5;

    for (auto& p : examp) {
        cout << *p << ' ';
    }
    cout << '\n';
}

您不能拥有std::atomic的向量,因为它不可复制或移动,但您可以拥有指向atomic的唯一ptr的向量。如果您确实需要原子的运行时可变大小向量,这可能是一个可行的替代方案。以下是一个例子:

#include <iostream>
#include <atomic>
#include <vector>
#include <memory>

using namespace std;

int main() {
    std::vector<std::unique_ptr<std::atomic<int>>> examp;
    examp.resize(64);   // 64 default unique_ptrs; they point to nothing

    // init the vector with unique_ptrs that actually point to atomics
    for (auto& p : examp) {
        p = std::make_unique<std::atomic<int>>(0);   // init atomic ints to 0
    }

    // use it
    *examp[3] = 5;

    for (auto& p : examp) {
        cout << *p << ' ';
    }
    cout << '\n';
}

我不知道。如果你不打算复制/移动原子,你可能会有一个常量数组。std::atomic examp[64]可以,但我确实计划最终改变大小。你打算拥有原子的运行时或编译时大小吗?如果大小在compile-time.runtime已知,编译器可以推断大小。取决于用户交互,它将在32到64之间。当然,您可以选择您计划支持的最大可能大小,这不像64整数是系统资源的巨大消耗。我不知道。如果你不打算复制/移动原子,你可能会有一个常量数组。std::atomic examp[64]可以,但我确实计划最终改变大小。你打算拥有原子的运行时或编译时大小吗?如果大小在compile-time.runtime已知,编译器可以推断大小。取决于用户交互,它将在32和64之间。当然,您可以选择您计划支持的最大可能大小,这不像64整数是系统资源的一大消耗。