我目前正在编写模板矩阵。 矩阵有一个
# 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;
}
就是这样。 这是一个问题吗?
答案 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();
}