当前位置: 首页 > 知识库问答 >
问题:

c语言模板中的向量赋值问题

关志
2023-03-14

我正在写一个程序来实现队列使用向量。我使用类作为模板。在主函数中,我试图根据模板数据类型创建字符串向量和int向量。然而,从矢量分配方法得到编译错误。

template <class T>
class queueWithArray {
private:
    vector<T> queueArray;
    int numberOfElements;
    int size;
    int head;
    int tail;

public:

    queueWithArray(int n) {
        numberOfElements = 0;
        head = -1;
        tail = -1;
        size = n;
        if(is_same<T,string>::value) {
            cout << "data type is string" << endl;
            queueArray.assign(n,"");
        } else {
            queueArray.assign(n,0);
        }
    }

...

int main() {
    string InputArray[] = {"to", "be", "or", "not", "to", "-", "be", "-", "-", "that", "-", "-", "-", "is"};
    queueWithArray<string> obj(2);
    for(auto i=0; i < (signed int)(sizeof(InputArray)/sizeof(InputArray[0])); ++i) {
        if(InputArray[i] == "-") {
            string item = obj.dequeue();
            cout << "dequeue->" << item << endl;
        } else {
            obj.enqueue(InputArray[i]);
            cout << "enqueue->" << InputArray[i] << endl;
        }

        obj.printQueue();

    }

    int InputArray_int[] = {10,20,30,40,50,-1,20,-1,-1,60,-1,-1,-1,70};
    queueWithArray<int> obj_int(2);
    for(auto i=0; i < (signed int)(sizeof(InputArray_int)/sizeof(InputArray_int[0])); ++i) {
        if(InputArray_int[i] == -1) {
            int item = obj_int.dequeue();
            cout << "dequeue->" << item << endl;
        } else {
            obj_int.enqueue(InputArray_int[i]);
            cout << "enquque->" << InputArray_int[i] << endl;
        }

        obj.printQueue();
    }
    return 0;
}

..\QueueUsingTemplate。cpp:135:31:此处为必填项。。\QueueUsingTemplate。cpp:45:4:错误:没有用于调用的匹配函数

共有1个答案

酆英达
2023-03-14

queryArray.assign(n, T{});解决了这个问题。你好路易斯,请在这里找到包含声明的完整程序。

/*
 * queueUsingArray.cpp
 *
 *  Created on: 02-Nov-2021
 *      Author: Admin
 */

#include <iostream>
#include <ctype.h>
#include <bits/stdc++.h>
#include <vector>
#include <typeinfo>
#include <type_traits>

using namespace std;

template <class T>
class queueWithArray {
private:
    vector<T> queueArray;
    int numberOfElements;
    int size;
    int head;
    int tail;

public:

    queueWithArray(int n) {
        numberOfElements = 0;
        head = -1;
        tail = -1;
        size = n;
        queueArray.assign(n,T{});
    }

    void enqueue(T item) {
        if(numberOfElements == size) {
            resize(size * 2);
        }
        if((head == -1) && (tail == -1)) {
            head = tail = 0;
        } else {
            tail = (tail + 1) % size;
        }
        queueArray[tail] = item;
        numberOfElements++;
    }

    T dequeue() {
        T item;
        if(numberOfElements == 0) {
            cout << "No elements to dequeue" << endl;
        } else {
            if(numberOfElements == size/4) {
                resize(size/2);
            }
            item = queueArray[head];
            if(head == tail) {
                head = tail = -1;
            } else {
                head = (head + 1) % size;
            }
            numberOfElements--;
        }
        return item;
    }

    bool isEmpty() {
        return ((head == -1) && (tail == -1));
    }

    void resize(int newSize) {
        if(newSize > 0) {
            size = newSize;
            int newIndex = 0;
            for(int i=head; i<=tail; ++i){
                queueArray[newIndex] = queueArray[i];
                newIndex++;
            }
            queueArray.resize(newSize);
            head=0;
            tail=newIndex-1;
        } else {
            return;
        }
    }

    void printQueue() {
        if(!isEmpty()) {
            for(auto i=head; i<tail; i++) {
                cout << queueArray[i] << "->";
            }
            cout << queueArray[tail] << endl;
        } else {
            cout << "Queue is Empty" << endl;
        }
    }
};

int main() {
    string InputArray[] = {"to", "be", "or", "not", "to", "-", "be", "-", "-", "that", "-", "-", "-", "is"};
    queueWithArray<string> obj(2);
    for(auto i=0; i < (signed int)(sizeof(InputArray)/sizeof(InputArray[0])); ++i) {
        if(InputArray[i] == "-") {
            string item = obj.dequeue();
            cout << "dequeue->" << item << endl;
        } else {
            obj.enqueue(InputArray[i]);
            cout << "enqueue->" << InputArray[i] << endl;
        }

        obj.printQueue();

    }

    int InputArray_int[] = {10,20,30,40,50,-1,20,-1,-1,60,-1,-1,-1,70};
    queueWithArray<int> obj_int(2);
    for(auto i=0; i < (signed int)(sizeof(InputArray_int)/sizeof(InputArray_int[0])); ++i) {
        if(InputArray_int[i] == -1) {
            int item = obj_int.dequeue();
            cout << "dequeue->" << item << endl;
        } else {
            obj_int.enqueue(InputArray_int[i]);
            cout << "enquque->" << InputArray_int[i] << endl;
        }

        obj_int.printQueue();
    }
    return 0;
}
 类似资料:
  • 模板赋值就是在控制器里把控制器的变量传递给模板,对于系统变量你不用赋值我们可以通过特殊的标签在模板里输出,变量赋值我们都通过assign方法进行赋值;所有assign方法,都必须在display,show,fetch方法执行前调用; 传递一个$name到模板 $this->assign('name','this is name'); 这样就可以在模板使用$name了,直接输出变量可以{$name}

  • 模板赋值通常在控制器中完成,控制器方法: $this->assign('模板中变量名', '控制器中变量'); 比如: $this->assign('user', $user);

  • 编程最简单的算法之一,莫过于变量交换。交换变量的常见算法需要一个中间变量进行变量的临时保存。用传统方法编写变量交换代码如下: 在计算机刚发明时,内存非常“精贵”。这种变量交换往往是非常奢侈的。于是计算机“大牛”发明了一些算法来避免使用中间变量: 这样的算法很多,但是都有一定的数值范围和类型要求。 到了Go语言时,内存不再是紧缺资源,而且写法可以更简单。使用 Go 的“多重赋值”特性,可以轻松完成变

  • 变量如果要在模板中使用,就必须先进行模板赋值才可以,但系统变量和配置参数可以不用赋值(我们会在模板章节介绍如何输出) 控制器基类的assign方法 <?php namespace app\portal\controller; use cmf\controller\HomeBaseController; class IndexController extends HomeBaseControll

  • 变量如果要在模板中使用,就必须先进行模板赋值才可以,但系统变量和配置参数可以不用赋值(我们会在模板章节介绍如何输出) 控制器基类的assign方法 <?php namespace app\demo\controller; use cmf\controller\HomeBaseController; class IndexController extends HomeBaseController

  • 问题内容: 最近我在玩Google的新编程语言Go 并想知道为什么赋值运算符在等号前面有一个冒号 ?语言的作者为什么要使用而不是 问题答案: 该符号既用作声明,又用作初始化。 相当于 您可能会问,为什么不像只使用任何脚本语言一样使用?好吧,那是为了避免错别字。