构建模板类中矢量矢量的迭代函数

时间:2015-11-17 12:22:26

标签: c++ vector iterator

我目前正在编写模板矩阵。 矩阵有一个

# create a separate labals dataframe
iris.lbl <- data.frame(lbl = levels(iris$Species), y=100)

# make the plot with everything set correctly
ggplot(iris, aes(x = Species)) +
  geom_bar(aes(y = Sepal.Length), stat = "identity", fill = "pink") +
  geom_text(data = iris.lbl, aes(x=lbl, y=y, label = lbl, hjust=0, angle = 90))

如何构建一个迭代向量矢量的const函数?

注意:我需要构建一个

vector<vector<T>> names mat, and contains the vectors size (rows and cols).

我问的是如何构建迭代器函数而不是如何使用迭代器。

到目前为止我所拥有的一切:

typedef typename std::vector<T>::const_iterator const_iterator

之前的尝试:     typedef typename std :: vector :: const_iterator const_iterator;

typedef typename std::vector<T>::const_iterator const_iterator;

const_iterator end()
{
    return mat[rowsNum][colsNum];
}

const_iterator begin()
{
    return mat[0][0];
}

- 编辑 - 目前,我的代码看起来像这样:

const_iterator end()
{
    return mat.end;
}

const_iterator begin()
{
    return mat.begin;
}

就是这样。 这是一个问题吗?

2 个答案:

答案 0 :(得分:3)

避免使用std::vector<std::vector<T>>。它在内存中不是连续的,不是高效的,从中处理迭代器并不简单。

我建议您,因为您似乎想要使用Matrix容器来展平您的数组并使用线性std::vector<T>代替,以便您只需重用std::vector<T>::const_iterator

示例

 template<class T>
 struct Matrix {
    using const_iterator = std::vector<T>::const_iterator;
    std::vector<T> mat;
    size_t rows;
    size_t cols;

    // [...] constructors etc...

    const_iterator end() const {
        return mat.end();
    }

    const_iterator begin() const {
        return mat.begin();
    }
    // and you don't need to specify anything else for your iterators.

    const T& operator()(size_t i, size_t j) const { return mat[i * rows + j]; } // depends if row major or column major storage
    // [...] and other convenient methods...
}

答案 1 :(得分:1)

你有向量的向量,所以,你的迭代器应该是

typedef typename std::vector<std::vector<T>>::const_iterator const_iterator;

功能应该是

const_iterator end() const
{
    return mat.end();
}

const_iterator begin() const
{
    return mat.begin();
}