将向量的向量复制到1D数组中 我有以下C++对象< /p> std::vector<std::vector<SomeClass>> someClassVectors(sizeOFOuter);
我有一个解决方案,就是像这样使用std::copy将向量的向量复制到1D数组中 我有以下C++对象< /p> std::vector<std::vector<SomeClass>> someClassVectors(sizeOFOuter);,c++,C++,我有一个解决方案,就是像这样使用std::copy int count = 0; for (int i = 0; i < sizeOfOuter; i++) { std::copy(someClassVectors[i].begin(), someClassVectors[i].end(), &someClassArray[count]); count += someClassVectors[i].size(); } int count=0; 对于(int i=0;i
int count = 0;
for (int i = 0; i < sizeOfOuter; i++)
{
std::copy(someClassVectors[i].begin(), someClassVectors[i].end(), &someClassArray[count]);
count += someClassVectors[i].size();
}
int count=0;
对于(int i=0;i
但是这个类包含大型矩阵,这意味着我不能同时分配两次“向量”结构和1D数组
有什么想法吗?您以前是否将
someClassArray
预先分配到给定的大小?如果可能的话,我建议使用1D向量来消除普通数组的已知问题
像这样的东西怎么样:
SomeClass * someClassArray;
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
std::vector<std::vector<int>> someClassVectors {
{1,2,3},
{4,5,6},
{7,8,9}
};
std::vector<int> flat;
while (!someClassVectors.empty())
{
auto& last = someClassVectors.back();
std::move(std::rbegin(last), std::rend(last), std::back_inserter(flat));
someClassVectors.pop_back();
}
std::reverse(std::begin(flat), std::end(flat));
int * someClassArray = flat.data();
std::copy(someClassArray, someClassArray + flat.size(), std::ostream_iterator<int>(std::cout, " "));
}
#包括
#包括
#包括
#包括
int main(){
向量类向量{
{1,2,3},
{4,5,6},
{7,8,9}
};
std::向量平坦;
而(!someClassVectors.empty())
{
auto&last=someClassVectors.back();
标准::移动(标准::rbegin(最后一个)、标准::rend(最后一个)、标准::back_inserter(平面));
someClassVectors.pop_back();
}
标准::反向(标准::开始(平面),标准::结束(平面));
int*someClassArray=flat.data();
std::copy(someClassArray,someClassArray+flat.size(),std::ostream\u迭代器(std::cout,”);
}
额外的反向操作不会对内存度量产生影响-这种方法有助于避免由于从头到尾删除向量元素而导致的不必要的内存重新分配
编辑
受评论启发,我将copy改为move semantics(或C++20中引入的任何内容),并(几乎)用一行代码编写解决方案:
auto flattedRange=ranges::views::join(someClassVectors);
这为您提供了一个flattedRange
范围,您可以轻松地循环或复制到其他地方
这是一个可能的用例:
#包括
#包括
#包括
int main()
{
std::矢量Ints2D={
{1,2,3},
{4},
{5,6}
};
auto Ints1D=范围::视图::连接(Ints2D);
//在这里,从Ints1D到C样式数组很容易,在另一个答案中已经显示了这一点
用于(自动常量和Int:Ints1D){
std::不能移动对象而不是复制它们。同样相关的是:有一种算法可以用来代替std::copy
+std::make_Move_iterator
。您也不希望从范围中移动常量迭代器。@blastfurny:我正要询问std::make_Move_iterator(std::crbegin(last))
等等。这似乎应该是非法的,但即使使用-std=c++2a-Wall-Werror
,g++
也允许这样做。将常量
迭代器转换为从源代码移动的迭代器是合法的吗?!但是这是范围::视图::连接(…)
摆脱Ints2D
还是它实际上是“复制”的“它变成了另一个物体吗?@mathys,你的问题的简短答案是不,它没有复制。在我的回答中,我对发生的事情做了更好的解释。