使用模板运算符创建二维关联阵列

Creating 2-D Associative Array Using Template Operator

本文关键字:二维 关联 阵列 运算符 创建      更新时间:2023-10-16

为了定义2-D关联数组,我在类中编写了模板运算符,使其更接近原始数组。这是我的操作员功能。

template <class T, class U, class V>
T& TwoAssocDArray<T,U,V>::operator [](U input1)[](V input2) {
    for(int i=0; i<size(); i++)
        if(stack[i].key1 == input1 && stack[i].key2 == input2) 
                return stack[i].d;
    DataPack pack;
    pack.key1 = input1;
    pack.key2 = input2;
    stack.push_back(pack);
    return stack[size].d;
}

类接口,

#ifndef _DATASTRUCTURE_H_
#define _DATASTRUCTURE_H_
#include <vector>
using namespace std;
template <class T, class U, class V>
class TwoDAssocArray {
private:
    typedef struct _DataPack {
        T d;
        U key1;
        V key2;
    } DataPack;
    vector<DataPack> stack;
public:
    int size();
    bool isIn(U input1, V input2);
    bool add(T data, U input1, V input2);
    T get(U input1, V input2);
    T& operator [](U input1)[](V input2);
};
#endif

然后我在main()中测试了它。

int main(int argc, char *argv[]) {
    TwoDAssocArray<int, char*, char*> assocArr;
    assocArr["in1"]["in2"] = 2246001;
    cout << assocArr["in1"]["in2"] << endl;
    return 0;
}

经过构建和运行,我发现它不起作用,出现了十几个错误。我认为主要原因是我不熟悉的模板语法。我相信大量的错误总是来自于一些语法错误。

如果有人能帮助我,我将不胜感激。

T& operator [](U input1)[](V input2);

你不能那样连锁经营者。你可能已经看到operator[]也只能接受一个参数,所以你对T& operator [](U input1, V input2); 不太幸运

从这篇文章的标题来看,你真的很想做:

assocArr["in1"]["in2"] = 2246001;

有一种方法可以获得这种功能,那就是在一个维度上实现它:

template <class T, class U >
class MyArray {
private:
    struct DataPack {
        T d;
        U key1;
    };
    std::vector<DataPack> stack;
public:
    T& operator[]( U key );
};
int main( void )
{
  MyArray< int, char > one_dimension;
  one_dimension[ 'a' ]; // returns an int reference
  // Now the trick
  MyArray< MyArray< int, char >, char > two_dimensions;
  two_dimensions['a']; // returns a MyArray< int, char > reference
  two_dimensions['a']['b']; // returns an int reference
}

另外,请注意我声明结构的方式,这是我的朋友C++。要添加,请不要使用char *,而是使用const char *。其实不用const char *,用std::string

可以测试const char *的相等性,但您不会比较c字符串中的内容,而是比较指针的地址。