我如何转换一个std::vector<双>到双数组[]?
当前回答
如果你有一个函数,那么你可能需要这样:foo(&array[0], array.size());。如果你遇到了需要数组的情况,那么你需要重构,向量基本上是扩展数组,你应该总是使用它们。
其他回答
有一个相当简单的技巧来做到这一点,因为规范现在保证向量连续存储它们的元素:
std::vector<double> v;
double* a = &v[0];
std::vector<double> vec;
double* arr = vec.data();
对于c++ 11, vector.data()就可以了。
你可以做一些这样的事情
vector <int> id;
vector <double> v;
if(id.size() > 0)
{
for(int i = 0; i < id.size(); i++)
{
for(int j = 0; j < id.size(); j++)
{
double x = v[i][j];
cout << x << endl;
}
}
}
对于std::vector<int> vec, vec获取int*,可以使用两种方法:
Int * arr = &vec[0]; Int * arr = vvector .data();
如果你想将任何类型的T向量转换为T*数组,只需将上面的int替换为T。
为了更好地理解,我将向你展示为什么上面两个是有效的?
vector本质上是一个动态数组。
主要数据成员如下:
template <class T, class Alloc = allocator<T>>
class vector{
public:
typedef T value_type;
typedef T* iterator;
typedef T* pointer;
//.......
private:
pointer start_;
pointer finish_;
pointer end_of_storage_;
public:
vector():start_(0), finish_(0), end_of_storage_(0){}
//......
}
range (start_, end_of_storage_)是vector所分配的所有数组内存;
range(start_, finish_)是vector使用的所有数组内存;
范围(finish_, end_of_storage_)是备份阵列内存。
比如向量vec。其中有{9,9,1,2,3,4}是指针,可以像下面这样。
因此,&vec[0] = start_ (address.) (start_等价于int*数组头)
在c++11中,data()成员函数只返回start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
推荐文章
- 找出质数最快的算法是什么?
- 与push()相反;
- 用“+”(数组联合运算符)合并两个数组如何工作?
- c++枚举类可以有方法吗?
- 使arrayList.toArray()返回更具体的类型
- 如何从对象数组中通过对象属性找到条目?
- 如何从关联数组中删除键及其值?
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 在函数的签名中添加关键字
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- .Net数据结构:ArrayList, List, HashTable, Dictionary, SortedList, SortedDictionary—速度,内存,以及何时使用每个?
- 为什么在标准容器中使用std::auto_ptr<>是错误的?