gpt4 book ai didi

c++ - 如何在不复制的情况下在唯一 vector 中传输小 vector 的集合

转载 作者:太空宇宙 更新时间:2023-11-04 15:46:55 25 4
gpt4 key购买 nike

我有一个 map<T,vector<double> > ,说 T=char值为 vector<double>length<nn=5 .我想转让每个 vector<double>从图到大vector<double>长度为 n*mapsize , 每个 vector 插入索引 5*k .如果可能,所有这些都无需复制。

#include <vector>
#include <map>
using namespace std;
int main()
{
typedef vector<double> Vec;
typedef map<char, vector<double> >::iterator ItMap;

//create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
double v_value[] = {1.1,2.4};
Vec v(v_value, v_value + sizeof(v_value)/sizeof(double));
map<char,vector<double> > myMap;
myMap['A'] = v;
v.push_back(10);
myMap['B'] = v;

//create the vector that should get all the small vectors
Vec receipt;
receipt.reserve(10);

for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
it->second.resize(5);
receipt.insert(receipt.end(),it->second.begin(),it->second.end());
}
}

编辑:我用我的解决方案进行了编辑,但它确实复制了。

最佳答案

正如我在评论中解释的那样,没有复制是不可能的; map 中的每个 vector 都是一个单独管理的动态数组,新 vector 是一个新的大数组。必须复制这些值。我不会担心这个,除非您已经分析并发现这是一个重要问题。

本着这种精神,std::copy拯救... de de, de de, dum de dum...

#include <vector>
#include <map>
#include <algorithm>

template<typename T, size_t N>
size_t length(T (&)[N]) {
return N;
}

int main()
{
typedef std::vector<double> Vec;
typedef std::map<char, vector<double> >::iterator ItMap;

//create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
double v_value[] = {1.1,2.4};
Vec v(v_value, v_value + length(v_value));
std::map<char,vector<double> > myMap;
myMap['A'] = v;
v.push_back(10);
myMap['B'] = v;

//create the vector that should get all the small vectors
Vec receipt(10);

for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
std::copy(it->second.begin(), it->second.end(), std::back_inserter(receipt));
}
}

对于用户定义的类型和/或比double 更复杂的类型,使用std::move 可能效率更高如果您的目标编译器支持 C++11。

我演示了一个计算数组长度的小技巧……我总是对 sizeof 感到困惑。

PS 我讨厌使用命名空间标准

关于c++ - 如何在不复制的情况下在唯一 vector 中传输小 vector 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15162952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com