数字误差的质因数分解
Prime factorization of number error
我做了一个函数,它返回一个包含整数所有素因数的vector
,我正在尝试做另一个函数,从该vector
创建一个map
。
但是,我遇到了一些典型的非法内存访问错误,我找不到它是什么。我认为它发生在map<int, int> factorizacion(vector<int>)
函数的for
循环中。
我希望我能在这里得到一些帮助。
我可以发布整个程序,但我只会坚持导致问题的功能。只需询问其余代码,以防您需要查看它。
map<int, int> factorizacion(vector<int> v) {
map<int, int> m;
while (!v.empty()) {
int elto = v.front();
int ctd = 0;
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
if (*it == elto) {
++ctd;
v.erase(it);
}
}
m[elto] = ctd;
}
return m;
}
修改迭代的集合:
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
if (*it == elto) {
++ctd;
v.erase(it);
}
}
如果擦除迭代器指向的项目,则不能继续使用相同的迭代器。
顺便说一句,您可以利用这样一个事实,即map
将自动初始化为不存在的键值的 0。
此代码将执行您想要的操作:
map<int, int> m;
for (int i = 0; i < v.size(); i++) {
m[v[i]]++;
}
唯一的问题是,在性能方面,我的解决方案有点慢 - 它执行的查询比最佳解决方案多。但是,我提出的解决方案比你的更好(当它得到修复时,因为):
- 在矢量中擦除是一项昂贵的操作,需要线性时间,比我
map
调整的性能要差得多 - 我不改变方法的参数。我知道它不是通过引用传入的,但是在可能的情况下,不要影响参数总是一个好主意。
v.erase(it)
使it
无效。您需要更改循环:
for (vector<int>::iterator it = v.begin(); it != v.end();) {
if (*it == elto) {
++ctd;
it = v.erase(it);
} else {
++it;
}
}
或者更好的是,使用类似于"擦除-删除"成语的std::remove
和.erase
。我不会在这里重复,因为你可以查一下。您可以将计数计算为两个迭代器之间的差值。
或者更好的是,计算因素而不删除它们,就像 Niklas 的评论一样。
相关文章:
- 通过递归进行因子分解
- 有人能分解一下这个c++模板的语法吗
- C++ 乔列斯基因式分解
- 如何加快本征C++中的LU分解?
- 如何将整数分解为不同的变量?
- 减少本征的 QR 分解
- Xcode 中的加速框架以获得 A 的 QR 分解,但找不到 zgeqrf
- 将无向连接图分解为两个组件
- 在 C++ 中分解数字
- 分解SWIG Python接口 - 容器会产生命名空间冲突
- 对模板参数包操作进行因素分解
- 如何修复 LU 分解?
- 动态矩阵特征分解过程中的误差
- 正在从程序内存中分解x指令
- 数字误差的质因数分解
- C将一个数分解成质因数
- 把一个数分解成质因数
- 用递归进行质因数分解
- 如何优化这个c程序来找到一个数字的质因数分解
- 给定一个数的质因数分解,在c++中不递归地遍历所有因子