0

考虑以下代码。我想做的是从提供的值数组初始化一个指针数组。我试图找出将这些值复制到指针中的最佳方法,并以 C++11 的方式进行。我正在使用 VS2010 编译此代码。

真正困扰我的部分是必须使用外部“i”来获取指针数组的正确索引。我考虑过为此使用 std::array ,但我在使用 std::algorithms (如 for_each )并让它在 VS2010 下编译时遇到了很多麻烦。那可能只是用户错误。

如果有人可以向我展示正确编译 VS2010 的语法,我愿意使用 std::array。在 stackoverflow 或其他地方找到 std::array 的好例子时,我运气不佳。我也不完全确定它是否会解决外部“i”的问题。

template <int ArraySize>
class testWithArray
{
   public:
   testWithArray(int* myarray)
   {            
      std::for_each(ArrayOfPointers_, ArrayOfPointers_ + ArraySize, [] (int* arrayElem) 
      {
         arrayElem = new int (0);
      });

      int i = 0;
      std::for_each(myarray, myarray + ArraySize, [&] (int arrayElem)
      {
         *(ArrayOfPointers_[i++]) = arrayElem;
      });
   }
   private:
   int* ArrayOfPointers_[ArraySize];
};



void main()
{
   int plainArray[5] = {0,1,2,3,4};
   testWithArray<5>  myArrayClass(plainArray);
}
4

1 回答 1

0

我真的不确定你为什么要使用一个指向整数的指针数组,而不仅仅是一个整数数组(这是我强烈推荐的),但如果这确实是你需要的并且你知道你在做什么(包括您的程序当前正在泄漏内存的事实),那么您可以用std::transform()这种方式重写您的构造函数:

#include <algorithm>

// ...

testWithArray(int* myarray)
{
    std::transform(myarray, myarray + ArraySize, ArrayOfPointers_,
        [] (int arrayElem)
    {
        return new int(arrayElem);
    });
}

但同样,请考虑您是否真的需要一个指针数组。如果你真的需要,那么考虑使用智能指针而不是原始指针(选择一个为你的应用程序建模最合适的所有权策略的指针)。

于 2013-06-10T19:35:04.407 回答