C++ 调整原子向量的大小?

C++ 调整原子向量的大小?,c++,multithreading,c++11,vector,atomic,C++,Multithreading,C++11,Vector,Atomic,如何调整原子向量的大小 例如,以下代码不编译: #include <iostream> #include <vector> #include <atomic> int main() { std::vector<std::atomic<int>> v; v.resize(1000); // Problem here! v[0] = 1; return 0; } #包括 #包括 #包括 int main(

如何调整原子向量的大小

例如,以下代码不编译:

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

int main()
{
    std::vector<std::atomic<int>> v;
    v.resize(1000); // Problem here!
    v[0] = 1;
    return 0;
}
#包括
#包括
#包括
int main()
{
std::向量v;
v、 调整大小(1000);//这里有问题!
v[0]=1;
返回0;
}
错误:

In file included from /usr/local/gcc-4.8.1/include/c++/4.8.1/vector:62:0,
                 from main.cpp:2:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_construct.h: In instantiation of ‘void std::_Construct(_T1*, _Args&& ...) [with _T1 = std::atomic<int>; _Args = {std::atomic<int>}]’:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:75:53:   required from ‘static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<std::atomic<int>*>; _ForwardIterator = std::atomic<int>*; bool _TrivialValueTypes = false]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:117:41:   required from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<std::atomic<int>*>; _ForwardIterator = std::atomic<int>*]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:258:63:   required from ‘_ForwardIterator std::__uninitialized_copy_a(_InputIterator, _InputIterator, _ForwardIterator, std::allocator<_Tp>&) [with _InputIterator = std::move_iterator<std::atomic<int>*>; _ForwardIterator = std::atomic<int>*; _Tp = std::atomic<int>]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:281:69:   required from ‘_ForwardIterator std::__uninitialized_move_if_noexcept_a(_InputIterator, _InputIterator, _ForwardIterator, _Allocator&) [with _InputIterator = std::atomic<int>*; _ForwardIterator = std::atomic<int>*; _Allocator = std::allocator<std::atomic<int> >]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/vector.tcc:556:42:   required from ‘void std::vector<_Tp, _Alloc>::_M_default_append(std::vector<_Tp, _Alloc>::size_type) [with _Tp = std::atomic<int>; _Alloc = std::allocator<std::atomic<int> >; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_vector.h:667:41:   required from ‘void std::vector<_Tp, _Alloc>::resize(std::vector<_Tp, _Alloc>::size_type) [with _Tp = std::atomic<int>; _Alloc = std::allocator<std::atomic<int> >; std::vector<_Tp, _Alloc>::size_type = long unsigned int]’
main.cpp:8:17:   required from here
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_construct.h:75:7: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
     { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
       ^
In file included from main.cpp:3:0:
/usr/local/gcc-4.8.1/include/c++/4.8.1/atomic:601:7: error: declared here
       atomic(const atomic&) = delete;
       ^
在/usr/local/gcc-4.8.1/include/c++/4.8.1/vector:62:0中包含的文件中,
来自main.cpp:2:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_-construct.h:在“void std::_-construct(_-T1*,_-Args&&…[with _-T1=std::atomic;_-Args={std::atomic}]的实例化中:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:75:53:从“静态”前向迭代器std::_uninitialized_copy::_uninitialized_copy(_inputierator,_inputierator,_ForwardIterator)[带_inputierator=std::move_迭代器;_ForwardIterator=std::atomic*;bool _valuetypes=false]中需要
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:117:41:从“_forwarditeratorstd::uninitialized_copy”(_InputIterator,_InputIterator,_ForwardIterator,_ForwardIterator)[with _InputIterator=std::move_iterator;_ForwardIterator=std::atomic*]中需要
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:258:63:从“_forwarditeratorstd:::_uninitialized_copy_a”(_inputierator,_inputierator,_ForwardIterator,std::allocator)[带_inputierator=std::move&_迭代器;_ForwardIterator=std::atomic*_-atomic*_-Tp=std::atomic])
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:281:69:从“_forwarditeratorstd::_uninitialized_move_if_noexcept_a”(_inputierator,_inputierator,_ForwardIterator,_分配器,_分配器&)[带_inputierator=std::atomic*;_ForwardIterator=std::atomic*)分配器]”
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/vector.tcc:556:42:void std::vector::_M_default_append(std::vector::size_type)[带_tpstd::atomic;_Alloc=std::分配器;std::vector::size_type=long unsigned int]中的必填项
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_vector.h:667:41:“void std::vector::resize(std::vector::size_type)[带原子的;_Alloc=std::分配器;std::vector::size_type=long unsigned int]中的必填项”
main.cpp:8:17:从这里开始需要
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_construct.h:75:7:错误:使用删除的函数“std::atomic::atomic(const std::atomic&)”
{::新建(静态_-cast(u-p))_-T1(标准::转发(u-args));}
^
在main.cpp中包含的文件中:3:0:
/usr/local/gcc-4.8.1/include/c++/4.8.1/atomic:601:7:错误:在此处声明
原子(常量原子&)=删除;
^

你不能…。

A既不能复制/移动,也不能将一个
std::atomic
分配给另一个;这意味着它不需要使用
(size\u type)

23.3.6.2
向量
构造函数、副本和赋值
[vector.const]

要求:
T
应可复制插入
*此

注意
std::vector::resize(size_type sz,T const&init)
也不适用,因为这要求
T
也可以
MoveInsertable


拟议决议

在修改已存储在其中的元素时,您将需要使用其他容器类型,而不需要移动、复制或复制/移动已构造的数据


您还可以在
std::atomic
周围定义一个包装器,它伪造复制/移动/分配,但实际上只是浅读/写底层atomic的值。

@delnan啊,太好了!谢谢你能在你的问题中包括编译错误吗?错误补充:问题是原子是不可复制的。看起来你不能调整
原子的向量大小-你最好先调整它的大小,比如说
std::vector v(1000)
,再也不要调整它的大小。当然,这使得
std::vector
成为事实上的数组:-(考虑使用
std::array
void resize (size_type sz);