std::矢量大小在尝试填充后保持为零
std::vector size remains zero after trying to fill it
我正在努力有效地使用向量。所以我先保留内存,然后使用向量。但在我尝试使用[]运算符填充向量后,向量的大小保持为零。为什么会发生这种情况?
vector Vec;
Vec.reserve(10);
Vec[0] = 2.0;
Vec[1] = 3.0;
...
reserve()
只在后备存储中保留空间,因此后续推送的元素不必进行重新分配(直到超出保留空间)。不过,它不会改变向量的实际大小,所以Vec[0] =
访问实际上是在向量的末尾运行的。
你可以使用
vector Vec;
Vec.resize(10);
Vec[0] = 2.0;
Vec[1] = 3.0;
如果你愿意的话,尺寸是10号。或者,如果您希望此时大小仅为2,但仍保留空间以避免多次重新分配,则可以使用
vector Vec;
Vec.reserve(10);
Vec.push_back(2.0);
Vec.push_back(3.0);
reserve()
不会调整矢量大小。您需要使用resize()
。
使用reserve
时,实际上并不是在向量中创建元素。您的工作分配正在访问不存在的元素。
std::vector不会自动展开。函数保留(大小)不会增加大小,它只能确保您有足够的内存用于以后的大小扩展。
所以不是非法的
Vec[0] = 2.0;
尝试
Vec.push_back( 2.0 );
这将使矢量大小增加1。
顺便说一下,申报单应该是
vector<double> Vec;
reserve
对矢量的大小没有影响。在大多数情况下我使用过的实现,下面的访问导致程序终止。如果没有,你可能使用错误的选项编译。
您应该直接构建大小为10:的向量
std::vector<double> vec( 10 );
如果要插入的值是常量,则可以执行类似于:
static double initVec[] = { 2.0, 3.0 ... };
std::vector<double> vec( begin( initVec ), end( initVec ) );
,或者如果您使用的是C++11:
std::vector<double> vec{ 2.0, 3.0 ... };
这两种方法都具有初始化直接在矢量中输入数据。
相关文章:
- 如何用文本填充 std::vector<int64_t>
- 用原始数据填充 std::vector
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 直接从 C API 填充 std::string
- 用常量值填充 std::vector<double>
- 在成员初始化列表中填充 std::array
- 可以使用 memset 来填充 std::complex<float>s 数组吗?
- 填充 std::d eque<std::vector<std::string>> with boost::assign::list_of
- 清除并重新填充 std::vector<std::vector<T>>导致分配问题
- 用类的第一个条目填充std::向量的首选方法
- 使用函数指针自动填充 std::map
- 如何从缓冲区及其大小填充std::向量
- 可以直接用get_line填充std::vector<std::string>
- 使用boost::bind()填充std::min_element()的自定义函数中的结构
- 填充 std::map 时"C2593: operator = is ambiguous"
- 在填充std::矢量时使用不同的地址
- 为什么从std::string的initializer列表中填充std::向量不会调用std::字符串构造函数
- 在编译时填充 std::数组,并使用 const_cast 填充可能的未定义行为
- 用异构boost::融合向量类型数据填充std::vector
- c++使用' .reserve() '填充' std::vector '作为防止多线程缓存无效和错误共享的一种方