向量初始化器列表

时间:2019-01-04 20:10:52

标签: c++11

我正在尝试使用自己的类实现矢量,因此无法执行初始化程序列表部分

# include <iostream>
# include <exception>
# include<initializer_list>
template <class T>
 class vector {
  public:
  T* a;
T n;
int pos, c;
vector() { a = 0; n = 0; }
vector(T n) : n(n) { a = new T[n]; }
vector(std::initializer_list <vector> l) {
    a = new T[int(sizeof(l))];
        for (int f : l)
            *(a + f) = l.begin() + f;
     }
 void push_back(T k) {
    int i = k;
    *(a + n) = k;
}
 vector& operator= (vector&& th) {
     this->a = th.a;
    th.a = nullptr; return (*this);
}
vector& operator=(vector& k)
{
    this->a = k.a;
    return(*this);
}
int  size() { return n; }
void pop_back() { *(a + n) = nullptr;
n--;
}
void resize(int c) {  
    delete a;
    n = c;
 a = new T[c];
 }
 T operator[](int pos) {
    if (pos > sizeof(a))
        std::cout << "out of range";

    else return *(a + pos);
 }
 };
 int main() {
vector<int> a(10);
vector<char>b{ 'w','b','f','g' };
getchar();
return 0;

}

我只是试图使用指针偏移量表示法将初始化程序列表项放入动态数组中,但在VS 17 IDE中遇到错误

Severity    Code    Description Project File    Line    Suppression   
Error   C2440   '=': cannot convert from 'const _Elem *' to 'T' 
Error   C2440   'initializing': cannot convert from 'const _Elem' to 'int'

1 个答案:

答案 0 :(得分:0)

你好Nimrod!

#include <iostream>
#include <exception>
#include <initializer_list>
// normally people don't place a space between '#' and 'include'

template <class T>
class vector {
public:
    T* a;
    int n;
    // probably it is length the vector
    // change T to int
    int pos, c;
    vector() { 
        a = nullptr;
        // do not use '0' to instruct null pointer 
        n = 0; 
    }

    vector(int n): n(n) { a = new T[n]; }

    vector(std::initializer_list<T> l) {
        a = new T[l.size()];
        // redundant force cast from size_t to int

        for (int i = 0; i < l.size(); i++) {
            a[i] = l.begin()[i];
        }
        // for (int f : l) # it seems that you wrote JavaScript before?
        //     *(a + f) = l.begin() + f;
    }

    void push_back(T k) {
        // assigns "T k" to "int i"? it's confusing

        // int i = k;
        // *(a + n) = k;
    }

    // probably still many problems
    vector& operator=(vector&& th) {
        this->a = th.a;
        th.a = nullptr;
        return (*this);
    }

    vector& operator=(vector& k) {
        this->a = k.a;
        return(*this);
    }

    int size() { return n; }

    void pop_back() { *(a + n) = nullptr;
        n--;
    }

    void resize(int c) {  
        delete a;
        n = c;
        a = new T[c];
    }

    T operator[](int pos) {
        if (pos > sizeof(a))
            std::cout << "out of range";
        else return *(a + pos);
    }
 };

int main() {
    vector<int> a(10);
    vector<char>b{ 'w','b','f','g' };
    getchar();
    return 0;
}

您仍然需要更多练习。 XP

  1. 在您的代码上下文中,initializer_list的模板变量应为T而不是int
  2. 具有initializer_list<T>
  3. Range for loop将获取值 列表中。因此,它应该属于T