RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-280035

Learpcs's questions

Martin Hope
Learpcs
Asked: 2022-06-29 18:57:38 +0000 UTC

所有可用参数的“模板参数太少”错误[关闭]

  • -1
关闭 这个问题是题外话。目前不接受回复。

寻求调试帮助的问题(“为什么这段代码不起作用? ”)应该包括期望的行为、具体的问题或错误,以及在问题中重现它的最少代码。没有明确描述问题的问题对其他访问者毫无用处。请参阅如何创建一个最小的、独立的和可重现的示例。

5 个月前关闭。

改进问题

我很抱歉一次推送所有巨大的代码,但我真的真诚地尝试简化代码 - 它会立即开始在简单的情况下编译。我真的不明白为什么这段代码不能编译。我有两个文件,它们通常可能不能很好地工作,但我想了解如何至少修复“模板参数太少”错误。我可能误解了语法。我是否正确定义了模板类中的方法?

hh 文件:

#pragma once
#include <memory>
#include <iterator>

template <typename T>
class NotSimpleIterator
{
public:
    using iterator_category = std::random_access_iterator_tag;
    using value_type = T;
    using difference_type = std::ptrdiff_t;
    using pointer = value_type*;
    using reference = value_type*;

    NotSimpleIterator(T* p);

    NotSimpleIterator& operator++();
    NotSimpleIterator operator++(int);
    value_type operator*();
    bool operator==(const NotSimpleIterator& rhs) const;
    bool operator!=(const NotSimpleIterator& rhs) const;

private:
    T* ptr;
    using value_type = T;
};

template <typename T, typename Alloc = std::allocator<T>>
class NotSimpleVector
{
public:
    using iterator = NotSimpleIterator<T>;
    NotSimpleVector();

    size_t size() const noexcept;
    size_t capacity() const noexcept;
    void push_back(const T& a);
    void pop_back();
    void insert();
    T& operator[](size_t index);
    iterator begin();
    iterator end();

private:
    T* arr;
    Alloc alloc;
    size_t sz;
    size_t cp;
};


template<typename T>
NotSimpleVector<T>::NotSimpleVector() : sz(0), cp(2), arr(std::allocator_traits<Alloc>::allocate(alloc, 2)) {}

template<typename T>
size_t NotSimpleVector<T>::size() const noexcept { return sz; }
template<typename T>
size_t NotSimpleVector<T>::capacity() const noexcept { return cp; }

template<typename T>
void NotSimpleVector<T>::push_back(const T& a)
{
    if (sz == cp)
    {
        T* new_arr = std::allocator_traits<Alloc>::allocate(alloc, 2 * cp);
        for (int i = 0; i < sz; ++i)
        {
            std::allocator_traits<Alloc>::construct(alloc, new_arr + i, arr[i]);
            std::allocator_traits<Alloc>::destroy(alloc, arr + i);
        }
        std::allocator_traits<Alloc>::deallocate(alloc, arr, sz);
        arr = new_arr;
    }
    std::allocator_traits<Alloc>::construct(alloc, arr + sz, a);
    ++sz;
}
template<typename T>
void NotSimpleVector<T>::pop_back() { --sz; }

template<typename T>
void NotSimpleVector<T>::insert()
{
    ++sz;
}

template <typename T>
T& NotSimpleVector<T>::operator[](size_t index) { return arr[index]; }
template <typename T>
NotSimpleIterator<T> NotSimpleVector<T>::begin() { return NotSimpleIterator<T>(arr); }
template <typename T>
NotSimpleIterator<T> NotSimpleVector<T>::end() { return NotSimpleIterator<T>(arr + sz); }

template <typename T>
NotSimpleIterator<T>::NotSimpleIterator(T* p) { ptr = p; }
template <typename T>
NotSimpleIterator<T>& NotSimpleIterator<T>::operator++()
{ 
    ++ptr; 
    return *this; 
}

template <typename T>
NotSimpleIterator<T> NotSimpleIterator<T>::operator++(int)
{
    NotSimpleIterator<T> cpy = *this;
    ++(*this);
    return cpy;
}

template <typename T>
T& NotSimpleIterator<T>::operator*() { return *ptr; }
template <typename T>
bool NotSimpleIterator<T>::operator==(const NotSimpleIterator<T>& rhs) const { return this->ptr == rhs.ptr; }
template <typename T>
bool NotSimpleIterator<T>::operator!=(const NotSimpleIterator<T>& rhs) const { return !(*this == rhs); }

main.cpp 文件

#include "h.h"
#include <iostream>
using namespace std;

int main()
{
    NotSimpleVector<int> a;
    int n;
    cin >> n;
    int x;
    for (int i = 0; i < n; ++i)
    {
        cin >> x;
        a.push_back(x);
    }
    for (int el : a)
        cout << el << ' ';
}

我尝试在 Visual C++ 和 G++ 中编译,但我不知道出了什么问题。G++ 错误:

h.h:53:37: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 NotSimpleVector<T>::NotSimpleVector() : sz(0), cp(2), arr(std::allocator_traits<Alloc>::allocate(alloc, 2)) {}
                                     ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:56:41: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 size_t NotSimpleVector<T>::size() const noexcept { return sz; }
                                         ^~~~~~~~
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:58:45: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 size_t NotSimpleVector<T>::capacity() const noexcept { return cp; }
                                             ^~~~~~~~
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:61:46: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 void NotSimpleVector<T>::push_back(const T& a)
                                              ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:78:35: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 void NotSimpleVector<T>::pop_back() { --sz; }
                                   ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:81:33: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 void NotSimpleVector<T>::insert()
                                 ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:87:47: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 T& NotSimpleVector<T>::operator[](size_t index) { return arr[index]; }
                                               ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:89:48: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 NotSimpleIterator<T> NotSimpleVector<T>::begin() { return NotSimpleIterator<T>(arr); }
                                                ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:91:46: error: invalid use of incomplete type 'class NotSimpleVector<T>'
 NotSimpleIterator<T> NotSimpleVector<T>::end() { return NotSimpleIterator<T>(arr + sz); }
                                              ^
h.h:29:7: note: declaration of 'class NotSimpleVector<T>'
 class NotSimpleVector
       ^~~~~~~~~~~~~~~
h.h:111:4: error: prototype for 'T& NotSimpleIterator<T>::operator*()' does not match any in class 'NotSimpleIterator<T>'
 T& NotSimpleIterator<T>::operator*() { return *ptr; }
    ^~~~~~~~~~~~~~~~~~~~
h.h:19:13: error: candidate is: NotSimpleIterator<T>::value_type NotSimpleIterator<T>::operator*()
  value_type operator*();
             ^~~~~~~~

Visual C++ 提供以下内容:

Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка  C2100   недопустимое косвенное обращение    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   16  
Ошибка  C2244   NotSimpleIterator<T>::operator *: не удается сопоставить определение функции существующему объявлению   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   112 
Ошибка  C2264   NotSimpleVector<int,std::allocator<T>>::NotSimpleVector: ошибка в определении или объявлении функции; функция не вызвана    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   7   
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   77  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   79  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   85  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   88  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   90  
Ошибка  C2976   NotSimpleVector<T,Alloc>: слишком мало аргументов шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   92  
Ошибка  C3536   <begin>$L0: не может использоваться до инициализации    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   16  
Ошибка  C3536   <end>$L0: не может использоваться до инициализации  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\ConsoleApplication9.cpp   16  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   63  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   79  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   83  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   88  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   90  
Ошибка  C3860   в списке аргументов шаблон, следующем за именем класса шаблон, параметры должны перечисляться в порядке, который используется в списке параметров шаблон    ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   92  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   66  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   69  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   70  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   72  
Ошибка  C3861   Alloc: идентификатор не найден  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   75  
Ошибка (активно)    E0147   объявление несовместимо с "NotSimpleIterator<T>::value_type NotSimpleIterator<T>::operator*()" (объявлено в строке 20 из "C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h")   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   112 
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   54  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   62  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   79  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   82  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   88  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   90  
Ошибка (активно)    E0498   список аргументов шаблона должен соответствовать списку параметров  ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   92  
Ошибка (активно)    E1670   квалификатор типа не разрешен на функции не элементам   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   57  
Ошибка (активно)    E1670   квалификатор типа не разрешен на функции не элементам   ConsoleApplication9 C:\Users\contest\source\repos\ConsoleApplication9\ConsoleApplication9\h.h   59  

Visual C++ 给出“模板参数太少”的错误,提示例如,NotSimpleVector<T>::NotSimpleVector()某行中缺少某些参数。但我不明白他还需要什么。我有同样的错误,一切似乎都很好

好吧,总的来说,最后一个问题:编译错误的原因是什么?语法不行?还是更严重的问题?当然,我不会强迫所有的代码都工作,也许我一般需要重做一半的课程。

c++ шаблоны-с++
  • 1 个回答
  • 73 Views
Martin Hope
Learpcs
Asked: 2022-08-18 03:13:39 +0000 UTC

如何使用列表理解打印字符出现的索引?

  • 0

例如,假设我有一些字符串some_str = "вася бежал по полю и умер",我想获取字母“a”的所有出现索引的列表。也就是说,我想做以下事情:

some_str = "вася бежал по полю и умер"
lst = []
for i in range(len(some_str)):
    if some_str[i] == "а":
        lst.append(i)
print(lst)

也就是说,该行的输出如下:

[1, 8]

是否可以在这里使用列表理解?也就是说,我有一个想法写如下:

lst = [x == "а" for x in some_str]

但是,当然,这并没有给出预期的结果。在我的情况下可以使用列表理解吗?

python
  • 2 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-04-29 19:38:54 +0000 UTC

如何为引用类型生成模板?C++

  • 1

首先,让我们看一下我的问题的代码:

#include <iostream>

template<typename T>
void sum(T x)
{
    x += 1;
}

int main()
{
    int a = 4;
    int& x = a;
    sum(x);
    std::cout << x;
}

我所期望的:因为我传递了对 int 的引用,所以我希望它在类型推断上T是相等的,int&并且生成的函数看起来像这样:

//T = int&
void sum(int& x)
{
    x += 1;
}

然而,程序的输出是:而不是4,正如预期的那样,5。这就是为什么我有这个问题。以下内容写在cppreference本身上:

1) 如果 P 不是引用类型,

a) 如果 A 是数组类型,则将 A 替换为数组到指针转换得到的指针类型;

b) 否则,如果 A 是函数类型,则将 A 替换为函数到指针转换得到的指针类型;

c) 否则,如果 A 是 cv 限定类型,则忽略顶级 cv 限定符进行推导

我的意思是,就我而言,我接受 "not a reference type" (not a reference type) T。只是说只有const-volatile修饰符会被忽略,还是我错了?为什么我的模板是这样生成的?或者模板不能是引用类型?出现了同样的问题,它可以是 typeint*吗?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-04-29 17:44:38 +0000 UTC

C++ 类型如何推断函数模板?

  • 2

事实上,我的意思并不是对我的问题进行完整而详尽的回答,否则我可以简单地被发送到cppreference来阅读这个巨大的阅读。也许有一天我会做,但目前我的英语水平不允许我做太多。但是我想大致了解一下他是如何决定推断类型的,具体我会用一个例子来分析我的问题:

#include <iostream>

template <typename T> 
T** createarray(int n, int m) {
    T** mas = new T*[n];
    for (int i = 0; i < n; i++) {
        mas[i] = new T[m];
    }
    return mas;
}

int main()
{
    int n, m;
    std::cin >>n >> m;
    double **arr = createarray(n, m);
}

我想创建一个二维数组,而数组元素可以是任何类型。但是代码无法编译,而且通常很清楚为什么。我正在尝试调用一个似乎不理解T. 例如,如果函数是这样的:

T** createarray(int n, int m, T another_argument) {
    T** mas = new T*[n];
    for (int i = 0; i < n; i++) {
        mas[i] = new T[m];
    }
    return mas;
} 

然后,一般来说,我们必须首先弄清楚传递给我们的类型是什么,并且函数将是相同的类型,这一点变得更加清楚。然而,在上下文中double **arr = createarray(n, m)LIKE HOW 很清楚该功能也必须是双重的?但是,这里又出现了一个问题,我能不能推导出函数的类型,比如说是int,然后强制转换为double?事实证明,我可以将其转换为任何类型,然后隐式转换。但是,如果我将一些更复杂的数据结构作为字符串传递怎么办?向量?不会再有这样的模棱两可了。然而,这个想法并没有消除编译错误。尽管总的来说,由于我不太确定 C++ 是如何真正尝试推断类型,因此这些想法​​并没有太大的根据。它实际上是否使用参数输出它们?有没有办法让我的函数在不明确指定类型的情况下工作:double **arr = createarray<double>(n, m).

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-04-15 23:41:58 +0000 UTC

我解决了这个问题,但我不明白它为什么会起作用。C++ 最大递增子序列问题

  • -1

任务:

给定 N 个整数 X1, X2, ..., XN。需要从它们中划掉最小数量的数字,以便剩余的数字按升序排列。

规范 输入 输入文件 INPUT.TXT 的第一行包含一个自然数 N。第二行包含 N 个由空格分隔的数字。(N ≤ 10,000, 1 ≤ Xi ≤ 60,000)

输出 在输出文件 OUTPUT.TXT 的第一行打印未划线数字的数量,在第二行 - 未划线数字本身以原始顺序用空格分隔。如果有多个选项,则应输出任何一个。

这是我的解决方案:

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;

int main()
{
    int n;
    cin >> n;
    vector<int> a(n), dp(n, 1);
    for (auto& x : a)
        cin >> x;
    int ans = 1;
    for (size_t i = 1; i < n; i++)
    {
        for (int j = i - 1; j >= 0; --j)
        {
            if (a[j] < a[i])
            {
                dp[i] = max(dp[i], dp[j] + 1);
                ans = max(ans, dp[i]);
            }
        }
    }
    vector<int> arr;
    for (int i = n - 1; i >= 0; i--)
    {
        if (dp[i] == ans && (arr.empty() || a[i] < arr.back()))
        {
            arr.push_back(a[i]);
            --ans;
            if (ans == 0)
                break;
        }
    }
    reverse(arr.begin(), arr.end()); //можно было и без этого, ну да ладно.
    cout << arr.size() << endl;
    for (auto& x : arr)
        cout << x << ' ';
}

自然地,在动力学的帮助下,我们将得到关于最长递增子序列的答案。在我们计算完动力学之后,问题立即出现,如何从中恢复这个子序列。我决定采用“贪婪”的方式,并开始从 dp 数组的末尾获取必要的元素。老实说,我不明白它为什么起作用。如果我从 dp[i] = x 中取出一些元素,然后对于一些 j < i 我不会找到 dp[j] = (x - 1),会发生什么。为什么总能找到东西?

事实上,似乎总是可以找到 dp[j] - 1 = dp[i] (好吧,这似乎是合乎逻辑的,如果有,假设 dp[i_1] = 4,那么它一定是 dp[i_2 ] = 3 while i_2 < i_1. 但是谁说条件 a[i_2] < a[i_1] 也会满足?..我不知道如何计算出来......

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-03-11 15:54:31 +0000 UTC

蛮力任务没有及时通过 C++

  • 0

任务条件:

给定 N 个整数 X1, X2, ..., XN。需要在它们之间放置“+”和“-”符号,以便结果表达式的值等于给定的整数 S。

规范 输入第一行的输入文件 INPUT.TXT 包含数字 N 和 S。下一行包含 N 个数字,以空格分隔。限制:2≤N≤24,0≤Xi≤5*10^7,-10^9≤S≤10^9。

输出在输出文件 OUTPUT.TXT 中,如果不可能得到这样的结果,则输出“无解”,否则输出结果相等。如果解决方案不是唯一的,请打印任何一个。

好吧,我对这个问题的第一个想法是:N 很小,这意味着很有可能理清所有可能的符号排列情况。好吧,使用“周到的样子”的方法,你就可以理解,这里不可能想出一个贪心算法。所以我实现了一个完整的迭代:

#include<iostream>
#include <string>
#include <vector>
using namespace std;

typedef long long ll;

string ans;

//функция генерации всех возможных сумм
void generate(const ll& need, ll sum_now, const vector<ll>& a, ll i, string str)
{
    if (i == a.size())
    {
        if (need == sum_now)
        {
            ans = str;
        }
    }
    if (i < a.size())
    {
        generate(need, sum_now + a[i], a, i + 1, str + "+" + to_string(a[i]));
        generate(need, sum_now - a[i], a, i + 1, str + "-" + to_string(a[i]));
    }
}

int main()
{
    ll n, s;
    cin >> n >> s;
    vector<ll> a(n);
    for (auto& x : a)
        cin >> x;
    
    //a[0] может быть только положительным, поэтому сразу вставляем его в сумму
    generate(s, a[0], a, 1, to_string(a[0])); 
    if (ans.empty())
        cout << "No solution" << endl;
    else
        cout << ans + "=" + to_string(s) << endl;
        
}

而这个决定并没有及时通过。而且还不完全清楚为什么。总共有 2^23 < 10^7 个搜索选项。理论上应该很快。有两个问题:

是否有可能以某种方式告诉程序立即结束所有递归调用并在找到正确答案时结束函数?当然,我有一个想法,你可以写return,但实际上我们只完成了1个调用?将包装这个版本这样做:

void generate(const ll& need, ll sum_now, const vector<ll>& a, ll i, string str)
{
    if (i == a.size())
    {
        if (need == sum_now)
        {
            ans = str;
            return;
        }
    }
    if (i < a.size())
    {
        generate(need, sum_now + a[i], a, i + 1, str + "+" + to_string(a[i]));
        generate(need, sum_now - a[i], a, i + 1, str + "-" + to_string(a[i]));
    }
}

自然,从理论上讲,这种优化不会有太大帮助,因为最长时间的工作仍然是是否应该显示“No solution”,这意味着枚举所有案例是不可避免的。如何优化我的算法?

问题出现了,这个问题是否有迭代解决方案,而不是递归解决方案?只是对他没有想法,如果你给我提示我会很高兴。

哈利的解决方案代码,也几乎通过了(见哈利的回答和评论):

#include<iostream>
#include <string>
#include <vector>
using namespace std;

typedef long long ll;

int main()
{
    ll n, s;
    cin >> n >> s;
    vector<ll> a(n);
    for (auto& x : a)
        cin >> x;
    int M = 1 << (n - 1);
    for (size_t i = 0; i < M; i++)
    {
        ll sum = a[0];
        int m = i;
        for (size_t j = 1; j < n; j++)
        {
            if (m & 1)
                sum += a[j];
            else
                sum -= a[j];
            m >>= 1;
        }
        if (sum == s)
        {
            cout << a[0];
            m = i;
            for (size_t j = 1; j < n; j++)
            {
                if (m & 1)
                    cout << "+" << a[j];
                else
                    cout << "-" << a[j];
                m >>= 1;
            }
            cout << "=" << s;
            return 0;
        }
    }
    cout << "No solution";
     
}
c++
  • 2 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-06-20 20:58:02 +0000 UTC

+ 不支持的操作数类型:“int”和“NoneType”

  • 0
def f(n):
    if n <= 1:
        return 1;
    elif n % 2:
        n + f(n - 2)
    else:
        n * f(n - 1)

print(f(84))

在某些时候,函数决定返回NoneType,但我不明白为什么。问题是什么?

python
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-06-18 16:01:24 +0000 UTC

while(-1 or -1) 循环不会终止

  • 0
s = 143*'687'
while s.find('68') or s.find('7777'):
    s = s.replace('68', '7', 1);
    s = s.replace('7777', '7', 1);
print(s)

在调试器中,可以看到获取到了行7,但是循环并没有结束。为什么?while 终止的标准是什么?在条件下应该只得到 0 吗?然后如何纠正我的周期?

python
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-06-18 14:35:52 +0000 UTC

return f(n+1) return f(n+2) 和 return f(n+1) 或 f(n+2) 有什么区别

  • 0

代码示例:

def f(x, y, p):
    if x + y >= 142 and p == 3:
        return True
    elif x + y != 142 and p == 3:
        return False
    return f(x + 2, y, p + 1) or f(x * 2, y, p + 1) or f(x, y + 2, p + 1) or f(x, y * 2, p + 1)

for i in range(1, 100):
    if f(2, i, 1):
        print(i)
        break

结论:

35

其他代码:

def f(x, y, p):
    if x + y >= 142 and p == 3:
        return True
    elif x + y != 142 and p == 3:
        return False
    return f(x + 2, y, p + 1) 
    return f(x * 2, y, p + 1)
    return f(x, y + 2, p + 1)
    return f(x, y * 2, p + 1)

for i in range(1, 100):
    if f(2, i, 1):
        print(i)
        break

没有结论。

这些代码之间有什么区别以及为什么不同的行为?

python
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2022-06-15 16:33:47 +0000 UTC

C++ 错误地解决了布尔代数问题

  • 0

任务:

任务

决定做一个蛮力:

#include <iostream>
using namespace std;

bool func(bool x, bool y, bool z, bool w)
{
    return (!y + z + !x * w) == (w == z);
}

int main()
{
    cout << "x" << " " << "y" << " " << "z" << " " << "w" << " " << "F" << endl;
    for (size_t x = 0; x < 2; x++)
    {
        for (size_t y = 0; y < 2; y++)
        {
            for (size_t z = 0; z < 2; z++)
            {
                for (size_t w = 0; w < 2; w++)
                {
                    if (func(x, y, z, w) == 1)
                    {
                        cout << x << " " << y << " " << z << " " << w << " " << "1" << endl;
                    }
                }
            }
        }
    }

}

程序输出:

x y z w F
0 0 0 0 1
1 0 0 0 1
1 1 0 1 1
1 1 1 1 1

我将稍微更改程序代码,使输出列与条件列相同。

#include <iostream>
using namespace std;

bool func(bool x, bool y, bool z, bool w)
{
    return (!y + z + !x * w) == (w == z);
}

int main()
{
    cout << "w" << " " << "y" << " " << "z" << " " << "x" << " " << "F" << endl; //<=== поменял местами x и w
    for (size_t x = 0; x < 2; x++)
    {
        for (size_t y = 0; y < 2; y++)
        {
            for (size_t z = 0; z < 2; z++)
            {
                for (size_t w = 0; w < 2; w++)
                {
                    if (func(x, y, z, w) == 1)
                    {
                        cout << w << " " << y << " " << z << " " << x << " " << "1" << endl; //<=== поменял местами x и w
                    }
                }
            }
        }
    }
}

程序输出:

w y z x F
0 0 0 0 1
0 0 0 1 1
1 1 0 1 1
1 1 1 1 1

来自条件的表格:

在此处输入图像描述

总的来说,我们看到程序输出的第二行等于条件表的第二行。但是条件表中有第一行和第三行,程序输出中只有一行(第三行)可以对应。问题是什么?我的程序没有生成所有可能的组合?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2021-12-04 02:59:41 +0000 UTC

是否可以为特定的 C++ 模板参数专门化模板

  • 1

假设我有一个带有两个参数的模板类。

template <class key, class value>
class HashMap
{
    ...

    size_t HashFunction(const key& k)
    {
        string s = to_string(k);
        size_t n = s.size();
        unsigned long long sum = 0;
        for (size_t i = 0; i < n; i++)
            sum += s[i];
        return sum % mod;
    }

    ...
}

而在这种情况下,它就是行不通的to_string()。string我需要创建一个模板专业化。但是如何仅为参数创建专业化key?

我说的是这个:

template<>
size_t HashMap<string, LUBOI TIP>::HashFunction(const key& k)
{
    size_t n = k.size();
    unsigned long long sum = 0;
    for (size_t i = 0; i < n; i++)
        sum += k[i];
    return sum % mod;
}
c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2021-12-04 02:28:18 +0000 UTC

错误:索引需要数组或指针 C++

  • 0

这是一个发生在我身上的例子:

#include <iostream>
using namespace std;

template<class key, class value> //пара с двумя параметрами - ключ и значение
struct pairs 
{
    key Key;
    value Value;
};

template<class key, class value>
struct test
{
    pairs<key, value>* arr; //указатель для массива пар.
    test(const size_t& size) //выделяю памяти для массива пар
    {
        arr = new pairs<key, value>[size]; 
    }
    value& operator[](const key& key) //возвращаю ЗНАЧЕНИЕ
    {
        return arr->Value[key]; //<=== ошибка всплывает тут
    }
};

int main()
{
    test<int, int> Example(100);
    Example[0] = 0;
    cout << Example[0];
}

此错误的原因是什么,我该如何解决?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2021-12-02 15:05:18 +0000 UTC

是否可以确定是否将值分配给 C++ 变量 [重复]

  • 0
这个问题已经在这里得到了回答:
空变量值 5 个答案
1 年前关闭。

描述我的问题的代码:

#include <iostream>
using namespace std;

int main()
{
    const int size = 10;
    int a[size];
    a[0] = 5;
        for (size_t i = 0; i < size; i++)
            cout << (a[i] == empty() ? 0 : a[i]);
}

功能empty()- 某种变量初始化检查。是否有可能在不使用下限的情况下以某种方式找出变量被赋值(也就是说,如果数组必须有正数,那么数组元素可以用零初始化)?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2021-12-02 01:21:13 +0000 UTC

如何为指针数组中的指针赋值 C++

  • -1

这是我的程序代码:

#include <iostream>
using namespace std;

int main()
{
    int** a = new int*[10];
    for (size_t i = 0; i < 10; i++)
    {
        a[i] = nullptr;
    }
    for (size_t i = 0; i < 10; i++)
    {
        *a[i] = i; //<========== на этом этапе ошибка
    }
    for (size_t i = 0; i < 10; i++)
    {
        cout << *a[i] << ' ';
    }
}

程序抛出异常:Вызвано исключение по адресу 0x00B425AC в Main.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000000.

为什么会这样?毕竟,我取消引用第 i 个指针并为其赋值,但理论上应该是正常的。

鉴于我需要留下一个指针数组,我该如何解决这个问题。

c++
  • 2 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2020-07-20 08:25:07 +0000 UTC

为什么键盘输入不起作用?C++

  • 0
#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct member
{
    string name;
    double distance = -1;
};

int main()
{
    int n;
    cin >> n;
    vector<member> a(n);
    for (size_t i = 0; i < n; i++)
    {
        //cin.clear()
        for (size_t z = 0; z < 3; z++)
        {
            string inp;
            cin >> inp;
            a[i].name += " " + inp; 
        }
        for (size_t j = 0; j < 6; j++)
        {
            double input;
            cin >> input;
            if (input > a[i].distance)
                a[i].distance = input;
        }
    }
}

我的输入数据示例(3 个单词,然后是 6 个数字或“x”):

8
GER Christian Reif 8.18 x 8.22 8.12 8.12 7.96
RSA Godfrey Mokoena 8.00 7.91 7.87 7.93 8.01 8.10
BRA Mauro Silva x x 8.09 8.05 8.23 8.24
MEX Luis Rivera 7.92 8.16 8.17 8.03 8.27 x
ESP Eusebio Caceres 8.09 8.25 8.17 x 8.26 8.20
RUS Aleksandr Menkov 8.14 7.96 8.52 8.43 8.56 x
JAM Damar Forbes 8.02 7.89 x x 8.00 x
NED Ignisious Gaisah 8.09 8.15 8.17 8.29 x 8.16

但是,如果我将此数据提供给程序的输入,那么它只考虑

8
GER Christian Reif 8.18 x 8.22 8.12 8.12 7.96

我找到了解决它的方法—— cin.clear()(我把它注释掉了)。但是问题。这个问题的原因是什么?为什么要cin.clear()修?

c++
  • 2 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2020-07-19 04:54:14 +0000 UTC

如何从继承人访问特定祖先的字段?

  • 3

这是描述我的问题本质的代码:

#include <iostream>

struct parent
{
    int quality = 1;
};

struct succesor : parent
{
    int quality = 2;
};

struct grandsuccesor : succesor
{
    int quality = 3;
};


int main()
{
    grandsuccesor example;
    std::cout << example.quality << std::endl << sizeof(example);
}

程序输出:

3
12

也就是说,该字段example.quality是从类本身中选择的,而不是从父类中选择的。但是,比方说,具体到父质量领域呢?毕竟sizeof(example) = 12,这意味着仍然有 3 个不同的变量。如何解决每个问题?

c++
  • 2 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2020-07-18 04:35:10 +0000 UTC

如何从另一个函数访问模板类的类型?

  • 0
template <class type>
class BigInteger
{
private:
    const type base = (1 << sizeof(type) * 4) - 1;
    vector<type> digits;

public:
    friend istream& operator >> (istream& in, BigInteger<type> object);
};

istream& operator >> (istream& in, BigInteger<type> object)
{
    string input;
    in >> input;
    for (auto i = input.rbegin(); i != input.rend(); i++)
    {
        object.digits.push_back(*i);
    }
    return in;
}

错误:E0020: идентификатор "type" не определен

在我的情况下如何解决?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2020-07-15 23:54:28 +0000 UTC

如何有效地实现您的 BigInteger?

  • 1

我想实现我自己的 BigInteger,但我想让它尽可能高效和快速。首先,我对如何有效地实现数字表示感兴趣。当然,第一个想法是在单独的数组或字符串中表示以 10 为底的每个数字。但我多次看到建议用 2^n 进制数表示数字是最好的解决方案。问题是为什么?如何在这样的数字系统中实现按位移位?一般而言,所有操作将如何运作?乘法?分配?还有哈利提到了 10^9 数字系统(在他的回答结束时)。为什么这也是比十进制更好的解决方案?少为每个数字创建“块”?从这个高速工作?

  1. 表示数字的最佳方式是什么?
  2. 存储它们的最佳方法是什么?细绳?动态数组?
  3. 如何在这样的“视图”中实现操作?
алгоритм
  • 1 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2020-07-12 07:03:30 +0000 UTC

使用了未初始化的 char 变量。C++

  • 0
#include <iostream>
using namespace std;

int main()
{
    while (char ch = cin.get() && ch != '=')
    {
       //что нибудь...
    }
}

输入任何字符时 - 关于未初始化变量的异常ch。为什么这里会捕获异常?ch很像它被初始化了。

c++
  • 3 个回答
  • 10 Views
Martin Hope
Learpcs
Asked: 2020-07-12 05:46:31 +0000 UTC

交互式数字猜测问题。C++

  • 2

任务条件:

这是一个交互式任务。

陪审团程序猜测一个整数 N (1 ≤ N ≤ 10^9),你的程序必须在不超过 100 次尝试中猜测。您可以通过从可能的整数范围中输出一个数字来进行查询。为响应每个请求,陪审团程序将报告将隐藏号码与请求中的号码进行比较的结果。

交互协议 在每次请求整数 X 之后,您的程序将在新行上收到将您的数字 X 与隐藏数字 N 进行比较的结果,该结果通过输出一个带换行符的字符来表示:

"<" :隐藏数严格小于请求中的数(N < X);

">" :隐藏数严格大于请求中的数(N > X);

“=”:隐藏的数字与请求中的数字匹配(N = X),收到这样的响应后,您的程序应该立即退出。

您的程序应该发出不超过 100 个请求。

我认为很明显你需要在这里使用二进制搜索。

#include <iostream>
using namespace std;

int main()
{
    long long l = 1, r = 10e9, mid = (l + r) / 2;
    while (true)
    {
        char input;
        mid = (l + r) / 2;
        cout << mid << endl;
        cin >> input;
        if (input == '>')
            l = mid + 1;
        else if (input == '<')
            r = mid - 1;
        else if(input == '=')
            return 0;
    }
}

程序没有按时运行。这是否意味着它“卡在”某个地方?但是哪里?为什么?理论上一切都应该正常工作......

c++
  • 2 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5