- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
恐怕这是一个相当大的问题,但这是简短的版本。我的程序需要删除散布在 vector 中的大量元素。这些元素与粒子有关,它还需要告诉任何在 vector 中移动过的粒子它们移动到了哪里。保持低内存成本是当务之急,因此理想情况下,我希望简化此过程,同时不更改我的数据结构(或尽可能缩小它们)。
现在是长版:
因此,我正在尝试制作一个尽可能高效的程序,在多个箱子(此处称为类别)中存储标签列表(与特定粒子相关),其中每个粒子只能用一个表示类别但可能出现多次(尽管不一定在相邻站点中)
类别有一个列表,其中列出了它们包含的粒子(每个粒子在数组中有一个元素),以及一个包含在特定站点中的粒子的列表。 (站点是我在整个特定数组中用于数组元素的特定名称)所以第一个可能是 (1,4,5),显示粒子 1、4 和 5 属于此类。第二个可能会读作 (4,5,1,1,4,4)。
为了进行反向树搜索,粒子分别知道它们在粒子和位置类别列表中的位置。 (所以 1 会知道它在粒子列表中排在第一位,在站点列表中排在第 3 和第 4 位)
理想情况下,我不想添加更多由这些数据结构存储的数字,因为最小化内存成本是我的首要任务,但如果必须的话,我会这样做。
我的问题是,删除与某个粒子对应的所有元素目前是一项成本非常高的操作,但我必须完成该过程的每一步,主要是因为必须找到与特定粒子相关的所有站点粒子以及告诉其他与之交换的粒子它们的位置已经移动。
我目前将我想要删除的所有网站都发送到后面并将它们弹出,我找不到更好的方法。
请记住,虽然示例中只有 3 个粒子,但在真实模拟中可能有数百万个。
下面是我的数据结构和我目前用来从类别中删除粒子的函数。目前最大的成本是将属于某个粒子的所有站点重新排序,以便按照它们在站点数组中的位置排序,我这样做的唯一原因是我知道在后面发现的任何粒子将是其网站列表的最后一个网站。
非常感谢您的帮助,抱歉这变成了一个大问题
(whichAtom 是已经选择的粒子标签,whichCategory 是它所在的类别)
struct particle
{
float rate;
int categorySite;
vector<int> occupiedSites;
};
struct bin
{
vector<int> atomsContained;
vector<int> sites;
};
vector<struct particle> atom (NUMBER_OF_ATOMS);
vector<struct bin> category (10);
void removeAtom()
{
//tells atom that was last in list of atoms in that category that it has changed position
atom[category[whichCategory].atomsContained.back()].categorySite = atom[whichAtom].categorySite;
//removes atom from list of atoms in that category
category[whichCategory].atomsContained[atom[whichAtom].categorySite] = category[whichCategory].atomsContained.back();
category[whichCategory].atomsContained.pop_back();
int numberOfSites = (int) atom[whichAtom].occupiedSites.size();
//removes sites from that category
for (int i = 0; i < numberOfSites; i++)
{
if (atom[whichAtom].occupiedSites[i] != category[whichCategory].sites.size()-1)
{
int categorySize = (int) category[whichCategory].sites.size();
int distanceFromBack = 1;
while (category[whichCategory].sites[categorySize-distanceFromBack] == whichAtom && (categorySize-distanceFromBack) != atom[whichAtom].occupiedSites[i])
{
distanceFromBack++;
}
int originalSite = atom[whichAtom].occupiedSites[i];
//teling the atom that it has changed site (requires last site listed in the atom to be the one nearest the back)
int targetAtom = category[whichCategory].sites[categorySize-distanceFromBack];
std::swap(atom[targetAtom].occupiedSites.back(), atom[whichAtom].occupiedSites[i]);
// makes sure that the sites are refenced in the order they appear in the array
if (atom[targetAtom].occupiedSites.size() > 1)
{
for (int j = 0; j < atom[targetAtom].occupiedSites.size(); j++)
{
for (int k = (int) atom[targetAtom].occupiedSites.size()-1; k > j; k--)
{
if (atom[targetAtom].occupiedSites[j] > atom[targetAtom].occupiedSites[k])
{
std::swap(atom[targetAtom].occupiedSites[j],atom[targetAtom].occupiedSites[k]);
}
}
}
}
//telling the category that the atoms in the sites have switched
std::swap(category[whichCategory].sites[originalSite], category[whichCategory].sites[categorySize-distanceFromBack]);
}
}
//removes previously occupied sites from atoms memory (MIGHT BE COMBINEABLE WITH ABOVE)
for (int i = 0; i < numberOfSites; i++)
{
category[whichCategory].sites.pop_back();
atom[whichAtom].occupiedSites.pop_back();
}
}
最佳答案
我倾向于建议不要使用这种反向引用(粒子记住它们的成员身份),正是因为它会使结构僵化并使删除更加乏味。对于粒子来说,只记住它们的类别并在必要时手动扫描这些数组可能比同时记住它们在这些类别中的位置(并保持准确的数据)更快。
关于c++ - 删除整个 vector 中散落的许多站点,从而使内存成本保持最低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19098986/
This question already has answers here: Closed 11 years ago. Duplicate: Recommended website resoluti
我有一个网络应用程序需要 IE9。其他浏览器(Firefox、Chrome、Opera 等)的等效浏览器版本是什么? 我知道如何检查用户当前的浏览器/版本,如果不支持,我需要看看是否可以为用户提供下载
我在比较 Mysql 数据库中的两个值并显示最低值时遇到问题。 比如我有这个: value1 = 23.4 value2 = 4.479 我试过这个: ORDER BY CAST(column AS
我有一个需要使用的功能,但我需要将我的最小 SDK 设置为 23 才能使用它。问题是,我们的应用程序运行在很多低端 SDK 设备上。有什么方法可以设置我的项目以允许我在编译应用程序的同时仍然使用较低的
我需要在32位数字中获得一个1位数字,其中只有一个1位(总是)。用C ++或asm最快的方法。 例如 input: 0x00000001, 0x10000000 output:
我已经对我的数据进行了分组。现在,我要做的是每周从“高”列中选择最高值,并从“低”列中选择最低值,然后使用最高值减去最低值得到范围。但是代码总是错误的。有人对我有想法吗? 这是我的 DataFrame
如何编写一个存储 20 个数字的数组,然后显示以下数据:数组中最小的数字、最大的数字、数字的总和以及它们的平均值? 最佳答案 使用java编程语言 int myArray[] = {15,25,85,
在学习 C 的同时做一些实验,我遇到了一些奇怪的事情。这是我的程序: int main(void) {sleep(5);} 当它被编译时,可执行文件的文件大小为 8496 字节(与 26 字节的源代码
我已经创建了我想在我的项目中使用的包。在包中,我使用的是 UIStackView。当我将包添加到项目并运行它时,我收到错误 'UIStackView' 仅适用于 iOS 9.0 或更高版本。如果我的项
我已经制定了一个程序来显示给定日期的特定时间的最高和最低流行项目。该过程没有错误或异常,并且一切正常。如您所见,为了显示 Items 的第一条记录,查询重复了两次,但唯一的区别在于顺序(ASC 和 D
我是 BPEL/BPMN 新手。 是否可以在没有 WS-* Web 服务和 EJB 容器(例如 jBoss、WebLogic、Glassfish)的情况下编写 BPEL/BPMN 感知软件? 我想知道
我们正在使用 OpenGL 4.3。但是,我们担心我们使用的功能适用于我们的显卡,但不符合 OpenGL 4.3 的“最低”要求规范。 是否有可能模拟最低限度的行为?例如,让显卡拒绝任何非标准纹理格式
我正在我的应用程序中实现 Facebook SDK。 按照 facebook 开发人员指南,除了我没有设置 GIT,所以我下载了 SDK,并将其导入 Eclipse,将 Java 合规级别更改为 1.
所以我构建了一个使用 API 15 中特定默认配色方案的应用程序。但是,我知道大多数设备仍在运行 API 10。为了吸引这些设备,我在我的设备上切换了最小 SDK设备到 10。这样做之后,我注意到我的
数据 所以,假设我有一个应用程序,我正在测试汽车的速度、性能、安全性等。我有一组以下格式的数据: CAR TABLE ID CAR_NAME 1 Ford Focus 2006 2 To
我有以下查询: SELECT AVG(q1) AS q1, AVG (q2) AS q2, AVG(q3) AS q3, AVG(q4) AS q4, AVG(q5) AS q5 FROM tresu
我刚刚创建了我的第一个 Android 应用程序(第 10 次)。我创建的项目的 sdk 比我预期的要高,现在我想降低它。我最初的 android maifest 不包含 部分,所以我补充说: 我还
我的小组作业是制作一个程序,允许用户输入任意数量的数字,然后程序会告诉你输入的最高数字、输入的最低数字、平均值、输入的总数和平均值。我们必须使用菜单。 我们已经写好了菜单。我们的大部分计算代码都在案例
我正在尝试设置一个显示文档目录中数据的 UITableView。 我对代码有点迷茫,因为我尝试了来自 Google 和论坛等的许多示例。 我正在创建没有 Storyboard 的应用程序,所以它全部在
我们都知道将最后 1 位设置为 0 的技巧 n&(n-1)。例如,0110 & (0110-1) = 0100。但是反过来呢?将最后一个 0 设置为 1?所以 0110 变成 0111? 我在 sta
我是一名优秀的程序员,十分优秀!