【问题标题】:What is an elegant solution to this error from std::find?std::find 对这个错误的优雅解决方案是什么?
【发布时间】:2016-06-22 17:06:13
【问题描述】:

我有一个类,其中包含一个在编译时大小未知的数组。数组在构造函数中初始化。然后,我有另一个函数来检查一个元素是否在数组中:

class myClass
{
   int tab[];
  public:
   myClass(int array[], int length)
   {  
      std::copy(array, array + length, tab)
   }
   void myFunction()
   {
      int x = 8;
      int *ptr = std::find(std::begin(tab), std::end(tab), tdc_x);
      if (ptr) /* here goes my code */
   }
};

我收到以下错误:

错误:没有匹配的函数调用'begin(int [0])'

上面的代码有什么问题?我知道我不能将 std::find 与指针一起使用,但我的数组是一个数组,而不是一个衰减的指针。

我遵循this 的例子。我还包括了 algorithm 标头。我做错了什么?

我用 C++11 编译我的代码。

编辑:我现在明白了。但是我怎样才能以优雅的方式做我想做的事呢?

  1. 如果我使用指针而不是空数组,我将无法使用 std::find。
  2. 如果我给我的数组一个任意大小,我将无法复制一个更大的数组。 我该怎么办?

【问题讨论】:

  • int tab[]; 你不能有空数组。
  • @πάντα ῥεῖ,我的数组不是空的,它还没有被初始化。编译器不会抱怨这一点。你能建议我想要实现的替代解决方案吗?
  • 你在哪里初始化的?
  • std::copy() 不会神奇地为你分配内存。
  • int tab[]; 定义了一个空数组(0 个元素的数组)。 C++ 标准不允许这样的数组。

标签: c++ arrays c++11 std c++-standard-library


【解决方案1】:
int tab[];

标准不允许空数组,但一些编译器可以作为扩展。这并不意味着它是合法的。

如果我使用指针而不是空数组,我将无法使用 std::find。

不对,你仍然可以使用std::finds 是你的标签数组的大小)。

  int *ptr = std::find(tab, tab + s, tdc_x);

如果我给我的数组一个任意大小,我将无法复制更大的数组。我该怎么办?

使用std::vector<int>,然后调用resize()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多