【问题标题】:the different combinations of a vector's values向量值的不同组合
【发布时间】:2012-04-26 10:01:39
【问题描述】:

假设我有一个包含 n 个值的向量,我想得到它的值的不同组合,例如:如果我有 vect = [a, b, c] 我想要的不同组合是:[a, b , c], [a,b], [a,c], [b,c], [a], [b], [c]

请注意,例如 [a,b] 与 [b,a] 相同,因此我不需要保留它们。

【问题讨论】:

  • 您正在寻找值向量的“幂集”;为了绝对准确,您正在寻找没有元素 [] 的幂集。这(空集)对应于@Henrik 答案中的数字 0。

标签: c++ vector superset


【解决方案1】:

0 计数到2^vector.size() - 1。如果循环变量的第 i 位为 1,请在组合中包含 vector[i]

vector<char> v;
v.push_back('a');
v.push_back('b');
v.push_back('c');
for (int counter = 0; counter < (1 << v.size()); ++counter)
{
    vector<char> combination;
    for (int i = 0; i < v.size(); ++i)
    {
        if (counter & (1 << i))
            combination.push_back(v[i]);
    }

    // do something with combination
}

编辑:如果要排除空集,从 1 开始计数。

【讨论】:

  • @user995434 - 设置 a = 1, b = 2, c = 4。这将为您提供数字 0..7 与 a、b、和 c。现在我的代码遍历数字 0..7 并通过检查位 0..2(值为 1、2、4)构建相应的组合。
【解决方案2】:

给你一个伪代码,请转换成真实代码。

vector resultVec;
while (!inputVec.empty)
{
    char c = inputVec.pop_back();

    foreach(one in resultVec)
    {
         combined = combine c and one;
         resultVec.push_back(combined);
    }

    resultVec.push_back(c);
}

【讨论】:

    【解决方案3】:

    想象一下,您有一个已经可以为您执行此操作的函数。我们就叫它combinations吧。

    如果您要实现自己的版本,my_combinations,您可以通过查看向量中的第一个元素,在向量的其余部分调用 combinations,然后将您的元素与每个组合。

    一旦你实现了这一点,你就可以委托给你自己的combinations 版本,而不是使用预先存在的版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多