如何在 C++ 中创建多个向量的组合而无需硬编码循环?

2024-04-21

我有几个数据看起来像这样:

Vector1_elements = T,C,A
Vector2_elements = C,G,A
Vector3_elements = C,G,T
..... up to ...
VectorK_elements = ...

#Note also that the member of each vector is always 3.

我想要做的是创建 Vector1 到 VectorK 中元素的所有组合。 因此最终我们希望得到这个输出(使用 Vector1,2,3):

TCC
TCG
TCT
TGC
TGG
TGT
TAC
TAG
TAT
CCC
CCG
CCT
CGC
CGG
CGT
CAC
CAG
CAT
ACC
ACG
ACT
AGC
AGG
AGT
AAC
AAG
AAT

我现在遇到的问题是我的以下代码通过对循环进行硬编码来实现这一点。 由于向量的数量可以变化,我们需要一种灵活的方法来获得相同的结果。 有没有?

我的这段代码最多只能处理 3 个向量(硬编码):

#include <iostream>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;


int main  ( int arg_count, char *arg_vec[] ) {

    vector <string> Vec1;
          Vec1.push_back("T");
          Vec1.push_back("C");
          Vec1.push_back("A");

    vector <string> Vec2;
          Vec2.push_back("C");
          Vec2.push_back("G");
          Vec2.push_back("A");

    vector <string> Vec3;
          Vec3.push_back("C");
          Vec3.push_back("G");
          Vec3.push_back("T");



     for (int i=0; i<Vec1.size(); i++) {
        for (int j=0; j<Vec2.size(); j++) {
            for (int k=0; k<Vec1.size(); k++) {
                cout << Vec1[i] << Vec2[i] << Vec3[k] << endl;
            }
        }
     }



    return 0;
}

您可以像里程表一样实现它,这会导致以下结果(适用于不同大小的向量):

假设数组 v 中有 K 个向量:v[0], v[1], ... v[K-1]

保留迭代器数组it(大小 K)到你的向量中,从it[i] = v[i].begin()。不断增加it[K-1]循环中。当任何迭代器命中end()对应的向量,你将它包裹起来begin()并增加前一个迭代器(所以当it[K-1]环绕,你增加it[K-2])。这些增量可能会“级联”,因此您应该向后循环执行它们。什么时候it[0]环绕,你就完成了(所以你的循环条件可能是这样的while (it[0] != v[0].end())

将所有这些放在一起,完成工作的循环(在设置迭代器之后)应该类似于:

while (it[0] != v[0].end()) {
  // process the pointed-to elements

  // the following increments the "odometer" by 1
  ++it[K-1];
  for (int i = K-1; (i > 0) && (it[i] == v[i].end()); --i) {
    it[i] = v[i].begin();
    ++it[i-1];
    }
  }

If you're interested in complexity, the number of iterator increments that get performed is easy to calculate. For simplicity here I'll assume each vector is the same length N. The total number of combinations is NK. The last iterator gets incremented each time, so that is NK, and moving back through the iterators this count gets divided by N each time, so we have NK + NK-1 + ... N1; this sum equals N(NK - 1)/(N-1) = O(NK). This also means that the amortized cost per-combination is O(1).

无论如何,简而言之,将其视为旋转数字轮的里程表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 C++ 中创建多个向量的组合而无需硬编码循环? 的相关文章

随机推荐

  • 如何在 swift 中检查 JSON 是否为 null?

    我目前正在开发一个应用程序 它可以返回 json 格式如下 location subtype 某个值 位置类型 强制 月份 2015 01 结果状态 类别 某个值 日期 某个值 如果 outcome status 具有值 则显示类别和日期
  • 如何在flutter中设置macos应用程序的默认大小?

    我正在尝试使用 flutter 构建 macOS 桌面应用程序 我希望应用程序是全宽 边到边的 但是 当我通过模拟器运行应用程序时 或者在构建之后 它总是启动大小为 800x600 的应用程序 我已将根容器的高度和宽度设置为 double
  • 如何用Hibernate实现3个多对多关系?

    我不能 100 确定这只是一个 Hibernate 问题 因为这可能是一个更抽象的决定 但我会尝试一下 由于问题描述有点长 我首先声明我想做的是看看是否可以将实现更改为更类似于最佳实践实现的东西 我有 3 个与此问题相关的实体 工作站 ws
  • 如何在 Ionic 3 中高效存储和使用身份验证

    我目前正在开发一个离子 3 4 适用于 iOS Android 的应用程序 我不熟悉身份验证过程或应用程序 在提供程序中使用 HTTP 请求后 我得到了我的对象 用户 但我完全不知道如何存储或处理它 有哪些好的做法 我是否应该将对象存储在提
  • 适用于 iPhone 视网膜显示屏的图像

    我有一个可以工作的应用程序 我已经在我的 iPod touch 上测试过了 一切都很好 我的标签栏图标和启动屏幕图像位于资源文件夹中的单独文件夹中 Resources gt images 现在 我知道对于 iPhone4 我需要使用 2x
  • 如何将列高设置为等于布尔玛(flexbox)中最长的列?

    我正在使用 Bulma 0 4 0 尽管答案可能与 Bulma 本身无关 如何将列高设置为与其他列相同 见下面的截图 编辑 codepen 包含更多显示实际行为的文本 https codepen io anon pen vmKVbx htt
  • Plon 全文索引 Excel 文件

    如何自定义 Plone 搜索引擎以激活 excel 文件的全文索引 我已经安装了 pdftotext 和 wv 用于 pdf word 文件全文索引 如果你添加产品 OpenXml https pypi python org pypi Pr
  • 在类中为其自己的字段使用 getter/setter 有什么好处吗? [复制]

    这个问题在这里已经有答案了 通常 在我自己的项目中 我使用 getter 和 setter 进行任何字段访问 并且我在工作中也遵循同样的做法 不久前 我们项目的技术负责人问我为什么要这样做 以及为什么这比仅仅使用字段本身更好 如果需要由子类
  • 由于频繁断网,repo 同步卡在 99%

    我尝试重新同步cyanogenmod源 一直到99 阶段 但是这个阶段好像有一个大文件 而且由于我的网络连接经常断开 所以无法下载它 每次发生断开连接时 fatal early EOF被打印出来 则repo sync停止 似乎在下次运行时
  • 幻影数据用例

    我试图理解 rust 中的 phantomData 我有一个 Foo 结构包裹着一个原始指针 我告诉编译器 Foo 不能比 a 更长寿 所以我试图防止属性 v 的值在 Foo 之前被删除 但是我发现当 String s 可以在 f 之前删除
  • 断开连接后保持 SSH 会话运行 - 过夜 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是对此的后续问题question https stackoverflow com questions 33041892 keep ssh
  • 使用 Word 互操作查找具有特定格式的一系列文本

    我有一个 MS Word 插件 需要仅根据其格式从一系列文本中提取文本 特别是在我的情况下 如果文本带有下划线或删除线 则带有下划线或删除线的字符 单词的范围通过需要找到 以便我可以跟踪它们 我的第一个想法是使用Range Find as
  • .Net File.GetLastAccessTime 更新文件的上次访问时间

    我们使用下面的行来获取文件的上次访问日期和时间 DateTime dtLastAccesstime File GetLastAccessTime sFilePath 但我们面临着奇怪的问题 上面的调用本身修改了最后访问时间 因此 我们有效地
  • Visual C++ 获取资源的路径

    我正在尝试将图像添加到 Visual C 项目并获取它的路径 基本上我想要的是向项目添加一些图像 以便它可以通过在项目内部而不是本地驱动器上获取必要的图像来在任何计算机上运行 我通过右键单击资源文件 在解决方案资源管理器菜单中 并添加 gt
  • 如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)创建新的 DateTime 对象?

    我已将时区设置为 config application rb 并且我希望默认情况下在我的应用程序中生成的所有时间都位于该时区 但是当我创建新的DateTime对象 使用 new 它创建它GMT 如何让它位于我的应用程序的时区 配置 应用程序
  • 如何将 NSString 从 CamelCase 转换为 TitleCase,将“playerName”转换为“Player Name”?

    我正在寻找将字符串从驼背格式转换为标题大小写格式的最简单方法 如何将 玩家姓名 更改为 玩家姓名 NSString str playerName NSMutableString str2 NSMutableString string for
  • 限制vb.net中列表框中的选择

    我正在 vb net 中创建一个包含列表框的 Web 控件 我知道我可以选择 单个 或 多个 选择模式 但我有兴趣将 多个 选择限制为预定大小 例如 阻止用户选择 3 个以上的项目 我尝试向列表框中添加一个验证器 这可能是一种前进的方法 但
  • 我无法刷新标准输入。如何在 C 中刷新标准输入?

    How to 刷新标准输入 为什么它在下面的代码片段中不起作用 include
  • Android:带有图标的选项菜单“更多列表”

    我喜欢 Android 在选项菜单中自动显示许多菜单项 当屏幕上的菜单项过多时 它会显示 更多 按钮 我想保持这种方式 但是当您按 更多 时弹出的菜单项中没有菜单图标 有什么办法可以让我否决这个吗 如果没有 当用户单击 更多 时如何显示我自
  • 如何在 C++ 中创建多个向量的组合而无需硬编码循环?

    我有几个数据看起来像这样 Vector1 elements T C A Vector2 elements C G A Vector3 elements C G T up to VectorK elements Note also that