【问题标题】:Cascade application of merging member function on vector of vectors with constraint合并成员函数在有约束向量向量上的级联应用
【发布时间】:2014-03-25 00:47:04
【问题描述】:

我有以下向量向量:

V = std::vector<std::vector<MyType> >

V 中包含的向量不一定具有相同的长度。 MyType 有一个成员函数合并,签名如下:

bool MyType::merge(MyType in, MyType &out);

这个成员函数接受 self 和 in 并检查它们是否可以合并到 out 中。如果是这样,则将 out 设置为合并的结果,并且 函数返回真。否则返回false,不修改out。

我想遍历 V 中的每个向量,并将所有可能的组合合并到最终结果 std::vector 中。举个例子, 如果 V 包含三个向量 A、B、C,每个向量有 3 个元素,我想得到一个具有以下结果的向量:

A_0 - B_0 - C_0
A_0 - B_0 _ C_1
A_0 - B_0 _ C_2
A_0 - B_1 - C_0
A_0 - B_1 _ C_1
A_0 - B_1 _ C_2
A_0 - B_2 - C_0
A_0 - B_2 _ C_1
A_0 - B_2 _ C_2
A_1 - B_0 ... etc

如果在任何时候合并返回 false,则合并的结果应该在结果向量中。

解释有点长,但我觉得这应该不是很难,我觉得有一个 使用一些 stl 功能完成此任务的简单方法,但我根本看不到它。

【问题讨论】:

  • 您提供的示例代码与您提供的函数签名并不真正匹配。它需要两个参数并返回一个布尔值,而您的示例代码表明它是一个一元 MyType 成员函数,返回一个 MyType(或可转换为它的东西)。
  • Arne,谢谢,我将示例更改为更通用,而不是实际的示例代码。
  • 我在您的示例中看不到任何“合并”。我只能看到计数。函数merge 在哪里调用?什么输入和什么输出?
  • “合并合并”是什么意思?你的意思是,例如对于A_0 - B_1 - C_0 行,您需要X = A_0; X.merge(B_1, Y); Y.merge(C_0, Z); 之类的东西?

标签: c++ algorithm combinations


【解决方案1】:

这听起来像是一个非常递归的问题,它正在合并向量元素的 N 维笛卡尔积:

您希望将 A 的每个元素与合并 B、C、... 中所有可能的合并元素组合的所有结果合并,并将其放入结果向量中,即将第一个维度与笛卡尔合并的结果合并其余 N-1 个维度的乘积。递归的结束是最后一个维度:

typedef std::vector<std::vector<MyType>>::const_iterator vvIter;
std::vector<MyType> cartesianMerge(vvIter start, vvIter end) {

   auto const& currentVector = *start;

   if (start+1 == end) return currentVector; //end recursion

   auto mergeWith = cartesianMerge(start+1, end); //recursie

   std::vector<MyType> results;
   MyType temp;
   for (auto const& lhs : currentVector)
     for (auto const& rhs : mergeWith )
        if (lhs.merge(rhs, temp)) results.push_back(temp);

   return results;
}

int main() {
  auto v = std::vector<std::vector<MyType> >{ /* ... you fill it! ... */ };

  auto allMerged = cartesianMerge(std::begin(v), std::end(v));
}

这可以使用std::transform 等标准算法进行概括,但由于它是一个条件转换(如果合并失败则没有结果),它看起来不会更清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多