C++ 将一种类型的STL对象存储到另一种类型的有效方法

C++ 将一种类型的STL对象存储到另一种类型的有效方法,c++,C++,我有一个STL对象,例如 std::vector <long> vec1; std::vec1; 我想把它转换成一个向量 std::vector <int> vec2; std::vectorvec2; 使用 std::map<long,int>map; std::mapmap; 有没有一种有效的方法可以动态删除映射到vec2的vec1元素,从而减小vec1的大小?这个算法应该消耗最少的内存,而且应该很快。有可能在适当的地方这样做吗?如果做得好,s

我有一个STL对象,例如

std::vector <long> vec1;
std::vec1;
我想把它转换成一个向量

std::vector <int> vec2;
std::vectorvec2;
使用

std::map<long,int>map;
std::mapmap;
有没有一种有效的方法可以动态删除映射到vec2的vec1元素,从而减小vec1的大小?这个算法应该消耗最少的内存,而且应该很快。有可能在适当的地方这样做吗?如果做得好,std::是否会删除_?与分块处理(即vec1被分为多个块)相比,性能如何;然后将每个区块映射并存储在vec2中;在此之后,将从内存中删除块


vec1(和vec2)也可以是矢量(矢量的矢量)。

如果您已经有了地图,您可以尝试以下(C++11)解决方案:

std::vector<long> vec1;  // Original vector
std::map<long, int> map; // How to map the `long` value to an `int`

std::vector<int> vec2;  // The destination vector

for (const auto l : vec1)
    vec2.push_back(map[l]);

在将元素复制到目标向量时,可以从源向量中删除元素

while (!source.empty()) {
  destination.push_back(map[source.back()]);
  source.pop_back();
}
这需要O(n log m)时间和O(1)空间,其中n是
source.size()
,m是
map.size()

有没有一种有效的方法可以动态删除映射到vec2的vec1元素,从而减小vec1的大小

向量的开头删除内容是低效的,因为它会导致剩余元素前移以填充开头的空白。向量末尾释放的内存不会返回堆,因为它是一个大内存块的一部分,一次释放

这里比较合适的是
std::queue
,它默认使用
std::deque
数据结构。这包括一系列小内存块。您可以在开始时使用
pop
释放内存

#include <queue>

std::queue <long> vec1;
std::queue <int> vec2;

while ( ! vec1.empty() ) {
    vec2.push( value_map[ vec1.front() ] );
    vec1.pop();
}
#包括
std::队列vec1;
std::队列vec2;
而(!vec1.empty()){
vec2.push(值映射[vec1.front()]);
vec1.pop();
}

您还可以直接使用
std::deque
对象。然后您可以使用
向前推
向后推
。这是一门很酷的课;即使对象不是像
vector
使用的那样在一个整体、平面阵列中,它也会保持对象“平面”序列的幻觉。

为什么不
std::map longToIntMap
我不想在得到vec2后将vec1存储在内存中?为什么要执行使用
map
的步骤?为什么不简单地在第一个向量上循环,并将值推到第二个向量中?除非您同时需要vector1和vector2?如果您想“回收”第一个向量使用的内存,然后,您可以在复制后简单地
清除它。这会在将vec1的元素推入vec2后自动删除它吗?我不想在处理期间将vec1的所有元素存储在内存中。增加内存消耗。有没有一种有效的方法,在向vec2添加元素/某些元素后,可以将它们从vec1中删除(删除并调整大小)@SumanVajjala请参阅WhozCraig评论中链接的SO问题。@SumanVajjala如果您所在的平台内存非常有限,无法同时在内存中包含两个向量,那么我建议你应该重新考虑你的算法。除非向量包含数百万个元素,否则即使是15岁的PC机也应该能够处理它,而不会出现太多问题。感谢Joachim提供的解决方案和评论。虽然这看起来很简单,但如果我有大约100万个long/core,并将大约1000万个double/core添加到这个存储中,情况可能会恶化。所以,我一直在寻找能够最小化内存存储开销的算法!!谢谢你的解决方案:)我想知道这个问题是否有一个现成的黑客或者其他什么。非常感谢你的建议。因此,即使从向量中弹出元素,其长度也不会改变(该内存不会被释放吗?@SumanVajjala a
vector
有一个
size()
(包含的有效对象数)和一个
capacity()
(使用的堆空间量)
pop_back
erase
等不会影响
容量
。因此,向量会保留一些内存(存储大小由capacity()给出),即使它的大小()为0?@SumanVajjala不,容量
会随着
大小
的增加而几何增加。(对于N
push_back
操作,预期O(对数N)重新分配到更大的
容量
),但当
大小
缩小时,
容量
保持在高水位。Ok。基尔。再次感谢您的建议/意见!!如果容量保持最高,这有关系吗?转换后,Vec1将不会在任何位置使用。
#include <queue>

std::queue <long> vec1;
std::queue <int> vec2;

while ( ! vec1.empty() ) {
    vec2.push( value_map[ vec1.front() ] );
    vec1.pop();
}