我想写入向量的内部数组。若矢量被初始化,我可以用data()
来写
但是,如果矢量是空的(但有足够的存储空间(,我就无法直接写入矢量的内部数组。
#include <vector>
#include <iostream>
using namespace std;
void write_seq(int *v, size_t len)
{
for (int i = 0; i < len; i++)
v[i] = i;
}
int main(void)
{
vector<int> v;
cout << "reserve and writen";
v.reserve(10);
write_seq(v.data(), v.capacity());
cout << "seq length " << v.size() << "n";
return 0;
}
输出:
$ g++ main.cpp && ./a.out
reserve and write
seq length 0
如何避免这种情况,是否可以验证向量的data()
指针?
编辑:
我对这个问题假设了两件事,在一个空的vector v;
上,
v.reserve(10)
为10个元素分配内存- CCD_ 5指向所分配的存储器
您希望使用resize
而不是reserve
,并使用size
而不是capacity
。reserve
只是给矢量增加容量,而没有实际增加大小。CCD_ 11增大大小以匹配预留容量。
不必担心需要预先预留多少内存。如果性能不是一个真正的问题,那么您可以考虑使用可自动调整大小的后插入迭代器来在您想要推送元素的步骤中推送它们。
#include <vector>
#include <iostream>
template<typename Iterator>
void write_seq(Iterator v) {
for (int i = 0; i < 10; i++) {
*v = i; // actually calls std::vector<>::push_back() internally
v++;
}
}
int main(void)
{
std::vector<int> v;
std::cout << "just write them data!n";
write_seq(std::back_inserter(v));
std::cout << "seq length " << v.size() << "n";
return 0;
}
您需要了解向量的size
和capacity
的概念。size是存储的元素数量,而capacity是分配的内部空间。容量总是大于或等于大小。如果在矢量中插入元素并导致矢量的容量不足,它将通过分配两倍于当前容量的新空间来自动增加容量,然后将现有元素复制到新空间,然后删除旧空间。
如果您计划将大量元素插入到向量中;"自动增加容量";特性的效率不高,因为它会不断地分配新的空间和复制元素。相反,您可以使用reserve()
预先分配足够的空间,从而避免不断分配新空间的过程。
capacity():
返回容器当前已为其分配空间的元素数。
reserve():
将矢量的容量增加到给定大小或更大。
size():
返回容器中的元素数。
resize():
更改存储的元素数。
回到您的问题,您可以简单地将reserve
替换为resize
:
int main(void)
{
vector<int> v;
cout << "reserve and writen";
v.resize(10); // use resize() instead of reserve()
write_seq(v.data(), v.size());
cout << "seq length " << v.size() << "n";
return 0;
}
或者,您可以直接插入矢量:
void write_seq(vector<int>& v, size_t len)
{
for (int i = 0; i < len; i++)
v.push_back(i); // add an element to the vector, this changes the size
}
int main(void)
{
vector<int> v;
cout << "reserve and writen";
v.reserve(10); // this does not change size, the vector is still empty
write_seq(v, v.capacity());
cout << "seq length " << v.size() << "n";
return 0;
}
不能为不存在的元素赋值。分配内存是不够的,但当你调整向量的大小(或用足够的元素创建它(时,你的代码是可以的:
int main(void)
{
vector<int> v(10); // vector with 10 element
write_seq(v.data(), v.size()); // write to those 10 element
cout << "seq length " << v.size() << "n"; // size is (still) 10
return 0;
}
请注意,您的代码不是很像idomatic。我想您有这样的理由,但将迭代器传递给write_seq
会更自然。