C++ 如何在不复制的情况下将小向量集合转移到唯一向量中
我有一个C++ 如何在不复制的情况下将小向量集合转移到唯一向量中,c++,map,stl,C++,Map,Stl,我有一个map,比如T=char值是长度秒的向量; receipt.insert(receipt.end(),it->second.begin(),it->second.end()); } } 编辑:我用我的解决方案进行了编辑,但它确实进行了复制。如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中: 如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中: 正如我在评论中解释的那样,没有复制是不可能
map
,比如T=char
值是长度秒的向量;
receipt.insert(receipt.end(),it->second.begin(),it->second.end());
}
}
编辑:我用我的解决方案进行了编辑,但它确实进行了复制。如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中:
如果您的向量包含任何便宜的可移动和昂贵的复制内容,您可以使用以下方法将每个小向量的内容移动到大向量中:
正如我在评论中解释的那样,没有复制是不可能的;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题
本着这种精神,为了营救。。。德德,德德,达姆,达姆
#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));
}
}
#包括
#包括
#如果目标编译器支持C++11,则包括
我演示了一个计算数组长度的小技巧。。。我总是被sizeof
弄糊涂
PS我讨厌使用命名空间std
正如我在评论中解释的那样,不复制是不可能的;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题
本着这种精神,为了营救。。。德德,德德,达姆,达姆
#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));
}
}
#包括
#包括
#如果目标编译器支持C++11,则包括
我演示了一个计算数组长度的小技巧。。。我总是被sizeof
弄糊涂
PS我讨厌使用命名空间std
不复制是不可能的;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题。也许你可以创建某种代理对象来用作地图值而不是向量。代理将返回对大n*k向量中单元格的引用;地图中的每个向量都是一个单独管理的动态数组,新向量是一个新的大数组。必须复制这些值。我不会担心这个问题,除非你已经分析并看到这是一个重要的问题。也许你可以创建某种代理对象来用作地图值而不是向量。代理将返回对大n*k向量中单元格的引用。@Cornstales:不幸的是,这是不可能的。这是一个很好的解决方案,如果你想坚持做可能的事情。@Alex谢谢,我希望swap
能有所帮助。我用我的答案编辑,但你的答案最后插入,我希望在适当的位置插入小向量(即:每个5个索引)…@statquant我明白你的意思,但是如果原始向量太小,你希望大向量保持什么std::swap
在这里是无用的,因为vector
的连续内存需求@Alex,0就可以了,这就是为什么我在我的“解决方案”@statquant中调整了它们的大小。在这种情况下,您的解决方案是最好的解决方案。@Cornstalks:不幸的是,这是不可能的。这是一个很好的解决方案,如果你想坚持做可能的事情。@Alex谢谢,我希望swap
能有所帮助。我用我的答案编辑,但你的答案最后插入,我希望在适当的位置插入小向量(即:每个5个索引)…@statquant我明白你的意思,但是如果原始向量太小,你希望大向量保持什么std::swap
在这里是无用的,因为向量
@Alex的连续内存需求是可以的,0,这就是为什么我在我的“solution”@statquant中调整了它们的大小。在这种情况下,您的解决方案是最好的解决方案。
for(const auto& e : m) {
std::copy(m.second.begin(), m.second.end(), std::back_inserter(big_vector));
}
#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));
}
}