程序终止:使用向量集的向量
Program killed: using vector of set of vector
在我的算法中,我需要保留(3字节)扩展ASCII字符的所有组合。以下是我的代码,但当我运行此代码时,当最后一步发生时,程序在终端上被终止(BigVector.prustback)。为什么会这样?在我的情况下,有什么替代方案?
vector<set<vector<int> > > BigVector;
set<vector<int> > SmallSet;
for(int k=0; k <256; k++)
{
for(int j=0; j <256; j++)
{
for(int m=0; m <256; m++)
{
vector<int> temp;
temp.push_back(k);
temp.push_back(j);
temp.push_back(m);
SmallSet.insert(temp);
}
}
}
BigVector.push_back(SmallSet);
p.S:我必须保留这样的ascii字符:{{(a,b,c),(a,b,d),……(z,z,z)}}
请注意256^3=16777216。这是巨大的,尤其是当你使用向量和集合的时候!
因为您只需要记录256=2^8的信息,所以可以将其存储在一个字符(一个字节)中。您可以将每个组合存储在一个由三个字符组成的元组中。内存现在为16777216/1024/1024=16 MB。在我的电脑上,它在1秒内完成。
如果您接受C++11,我建议使用std::array
,而不是在旧代码中编写像Info
这样的辅助结构。
C++11代码使用std::array。
vector<array<char,3>> bs;
.... for loop
array<char,3> temp;
temp[0]=k; temp[1]=j; temp[2]=m;
bs.push_back(temp);
C++98代码使用国产结构。
struct Info{
char chrs[3];
Info ( char c1, char c2, char c3):chrs({c1,c2,c3}){}
};
int main() {
vector<Info> bs;
for (int k = 0; k < 256; k++) {
for (int j = 0; j < 256; j++) {
for (int m = 0; m < 256; m++) {
bs.push_back(Info(k,j,m));
}
}
}
return 0;
}
使用组合的方法。(您可以为Info编写包装器方法)。
// Suppose s[256] contains the 256 extended chars.
for( auto b : bs){
cout<< s[b.chrs[0]] << " " << s[b.chrs[1]] << " "<< s[b.chrs[2]] << endl;
}
首先:您的示例与实际代码不一致。您正在创建({(a,a,a),…,(z,z,z)})
如前所述,您将有16'777'216个不同的矢量。由于矢量对象的原因,每个矢量将包含3个字符,通常约20字节[1]的开销。
此外,一个典型的矢量实现将为未来的push_backs保留内存。
您可以通过在初始化期间指定正确的大小或使用reserve():来避免这种情况
vector<int> temp(3);
(capacity()告诉你矢量的"实际"大小)
pushback会复制您正在推送的对象[2],这可能会占用太多内存,从而导致程序崩溃。
16'777'216*(3个字符+20个开销)*2个副本=约736MiB
(这假设矢量已经用正确的大小初始化!)
有关复制问题的可能解决方案,请参见[2]。
我同意Potatoswatter的观点:你的数据结构效率很低。
[1] 空向量的开销是多少
[2]std::vector是否使用push_back复制对象?
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 在使用标准向量函数时引发'std::bad_alloc'实例后调用的终止
- 如何在C++中使用 if 语句终止向量输入
- (C++) 学习向量 - 编码/输入流终止/比较向量的问题
- C :终止循环的最优雅方法,该循环在字符串向量上迭代
- 尝试将未知数量的字符串推送到向量中,但我的 cin 循环没有终止
- 程序终止:使用向量集的向量
- 如何在类中声明预终止长度的向量
- 循环终止条件错误的 cpp 向量
- std::向量使用const_iterator终止程序
- C++ 在抛出字符串向量"std::out_of_range"的实例后调用的终止