0

如果满足条件,我只想将 a[i] 添加到结果数组中,但是此方法会在添加到 result[i] 时导致数组中的元素为空。有一个更好的方法吗?

for(int i=0; i<N; i++)
{
    if(a[i]>=lower && a[i]<=upper)
    {
        count++;
        result[i]=a[i];
    }
}
4

3 回答 3

4

你可以先让result空,并且只有push_back a[i]在满足条件时:

std::vector<...> result;

for (int i = 0; i < N; i++)
{
    if (a[i] >= lower && a[i] <= upper)
    {
        result.push_back(a[i]);
    }
}

count你可以省略,因为它会result.size()告诉你有多少元素满足条件。


要获得更现代的解决方案,就像一些程序员老兄建议的那样,您可以std::copy_if结合使用std::back_inserter来实现相同的目标:

std::vector<...> result;

std::copy_if(a.begin(), a.end(), std::back_inserter(result),
    [&](auto n) {
        return n >= lower && n <= upper;
    });
于 2021-04-12T12:54:03.013 回答
0

C++ 中的数组是愚蠢的。

它们只是指向数组开头的指针,不知道它们的长度。

如果你只是 arr[i] 你必须确保你没有越界。在这种情况下,这是未定义的行为,因为您不知道您写了内存的哪一部分。您也可以覆盖不同的变量或另一个数组的开头。

因此,当您尝试将结果添加到数组时,您已经必须创建具有足够空间的数组。

这个删除和创建哑数组的样板,以便您可以增长数组在容器中非常有效地完成,该std::vector容器记住存储的元素数量、可以存储的元素数量和数组本身。每次您尝试在保留空间已满时添加元素时,它都会创建一个两倍于原始数组大小的新数组并复制数据。在最坏的情况下是 O(n) 但在平均情况下是 O(1) (当 n 低于某个阈值时它可能会偏离)

然后 Stack Danny 的答案适用。

如果可以的话,也可以使用它emplace_back来代替push_back它,它能够根据构造函数参数就地构造数据类型,在其他情况下,它会尝试像push_back. 它基本上以最快的方式完成您想要的操作,因此您可以避免尽可能多的副本。

于 2021-04-12T14:11:38.087 回答
0
count=0;
for(int i=0; i<N; i++)
{
   if(a[i]>=lower && a[i]<=upper)
   {
       count++;
       result[count] = a[i];
   }
}

尝试这个。

您的代码正在从 a[i] 复制元素并将其粘贴到 result[i] 的随机位置。例如,如果 a[0] 和 a[2] 满足要求的条件,但 a[1] 不满足,那么您的代码将执行以下操作:

result[0] = a[0]; 
result[2] = a[2];

注意 result[1] 是如何保持为空的,因为 a[1] 不满足要求的条件。为避免结果数组中的位置为空,请使用另一个变量而不是 i 进行复制。

于 2021-04-12T16:55:12.427 回答