是否可以将std :: vector传递给期望CArray的MFC函数?

时间:2016-12-05 23:05:49

标签: c++ vector mfc interop dynamic-arrays

我有一个

std::vector<double> vecArr

如何将其传递给函数

BOOL AddData (const CArray<double,double>& arrValue)

评论表明这是不可能的,建议我先将std::vector对象转换为CArray对象。然而,就时间而言,这是非常昂贵的 - 我在我的机器上测量了7秒和7毫秒的差异。

// Copy vector v1 to v2  (very fast)
vector<double> v1;
v1.resize(1000000);         // 1 Mio elements
vector<double> v2(v1);      // ~7ms 

// Copy vector v1 to CArray a1 (very slow)
CArray<double, double> a1;
a1.SetSize(v1.size());      // Reserve 1 Mio elements
vector<double>::iterator it = v1.begin();
while (it != v1.end())     // ~7sec ! :((
   arr.Add(*it++);` `   

是否有某种方法可以改善此解决方案的性能?

1 个答案:

答案 0 :(得分:1)

无法将std::vector“重新解释”为CArray。虽然两个类都代表相同的概念,但它们并不相同。这就像两种完全不同的语言。你可能会用俄语说同样的话,但我无法理解,因为我看不懂俄语!

你基本上有三个选择:

  1. 将<{em}转换为<{1}} {/ 1}}。

    就像从俄语翻译成英语一样,这需要时间。幸运的是,与语言翻译不同,这是一个微不足道的过程。您只需遍历原始std::vector并将每个元素复制到新的CArray

    如果您注意为所需数量的元素预先分配空间,则可以在O(n)时间和空间内完成此操作。它不是免费的,但它(通常)也不是非常昂贵。

  2. 更改函数的界面,使其接受std::vector个对象。

    可以说,这是最佳选项。您应该标准化库容器类并远离MFC容器类。这有很多原因,包括互操作性和性能。

    明显的缺点是它需要更改代码 - 潜在的大规模和突破性更改 - 这些都是耗时且容易出错的。但这是一个非常有益的重构,无论如何都需要完成,除非代码完全依赖生命支持而不是进一步改进。一旦重构完成,运行时就不会有性能成本,从而产生理想的解决方案。

  3. 采用“混合”解决方案,您可以在其中更改函数的接口以接受最小公分母参数。具体来说,更改函数以使其接受C样式数组(一个参数是指向数组中第一个元素的指针,第二个参数表示数组的长度)。

    这导致最大的兼容性,因为CArray对象和std::vector对象都可以被处理/重新解释,就好像它们是基本的C样式数组一样,因此可以最大限度地减少侵入性更改的数量在整个代码库中都是必需的。在本地,你可以使用方便的容器类型,然后为了互操作性,你传递最低公分母,这是通常的。

    此解决方案的缺点很多,并且与首先使用类型安全容器的原因相同,因此如果解决方案#2完全可行,您应该更喜欢这样做。