Arrays 向量<;向量<&燃气轮机&燃气轮机;以C++;

Arrays 向量<;向量<&燃气轮机&燃气轮机;以C++;,arrays,c++11,vector,Arrays,C++11,Vector,我已经阅读了很多关于转换的SO线程,但是向量如何使用.data()成员函数正确运行,但是这将为您提供一个类型为std::vector的对象数组,而不是类型为T的对象数组。要真正展平嵌套向量,您需要自己进行。像这样的事情可能会奏效 // 1. Compute the total size required. int total_size = 0; for (auto& vec : vectors) total_size += vec.size(); // 2. Create a vect

我已经阅读了很多关于转换的SO线程,但是
向量如何使用
.data()
成员函数正确运行,但是这将为您提供一个类型为
std::vector
的对象数组,而不是类型为
T
的对象数组。要真正展平嵌套向量,您需要自己进行。像这样的事情可能会奏效

// 1. Compute the total size required.
int total_size = 0;
for (auto& vec : vectors) total_size += vec.size();

// 2. Create a vector to hold the data.
std::vector<T> flattened;
flattened.reserve(total_size);

// 3. Fill it
for (auto& vec : vectors)
    for (auto& elem : vec)
        flattened.push_back(elem);

// 4. Obtain the array
auto ptr = flattened.data();
//1。计算所需的总大小。
int total_size=0;
对于(auto&vec:vectors)total_size+=vec.size();
// 2. 创建一个向量来保存数据。
std::向量展平;
平整。保留(总尺寸);
// 3. 填满它
用于(自动和矢量:矢量)
用于(自动和电气:vec)
展平。向后推(elem);
// 4. 获取数组
auto ptr=flatted.data();
对于较旧的编译器,可以像这样迭代向量

for (std::vector<std::vector<T> >::iterator iter = vectors.begin();
     iter != vectors.end(); ++iter) {
    for (std::vector<T>::iterator iter2 = iter->begin();
         iter2 != iter->end(); ++iter2) {
        flattened.push_back(*iter2);
    }
}
for(std::vector::iterator iter=vectors.begin();
iter!=vectors.end();++iter){
对于(std::vector::iterator iter2=iter->begin();
iter2!=iter->end();++iter2){
展平。向后推_(*iter2);
}
}
或者只使用普通的旧索引和
.size()
成员函数


在内部,std::vector保留指向其元素的指针,因此从概念上讲,最外层的data()必须被视为指针数组,而不是2D数组。因此,我们必须手动遍历并展平它。

为了说明嵌套向量是如何存储的,并说明为什么很难将其转换为数组,我做了以下实验(有结果):

//库
#包括
#包括
//名称空间
使用名称空间std;
int main()
{
//创建包含整数的二维向量
向量v={11,21,31,41},{12,22,32,42},{13,23,33,43},{14,24,34,44};
//向向量添加更多整数
v、 推回({15,25,35,45});
v、 推回({16});
//以标准方式迭代和打印向量值
cout begin();v_element!=v_row->end();v_element++){

你可以使用
data()
获取内部数组。通过
cout
-ing查看数组的外观。请记住,这种事情可能是特定于平台的。如果你想要一个特定的布局,并且你知道内部向量的类型(例如,如果它不包含另一个向量,则包含另一个向量,等等)然后您可以为此编写自己的循环。如果我不使用基于范围的for,那么旧编译器的替代方案是什么?我不断收到转换错误。我的变量是
vector matrix(n,vector(n,0));
,其中
n
是任何正数,我的迭代器声明为
for(vector::迭代器vec=matrix.begin();vec
。请参阅我的编辑。最外层的循环需要使用
vector::iterator
,最内层的循环需要使用
vector::iterator
。更正我之前的陈述:即使需要多维内存连续数据集,也最好使用1D向量并在外部处理索引,而不是使用老式的数组d可能会导致不必要的内存泄漏以及堆栈和堆内存问题。