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

c为costum类创建常量迭代器

越安翔
2023-03-14

我有一个自定义模板类-

template <class T>
class myClass{
    vector<vector<T>> matrix;
    //rest of the code...
};

我想要一个常量迭代器开始于myClass,常量迭代器结束于myClass,它能够迭代myClass矩阵中的对象T,我正在努力创建这样的东西。

在我看来,我想把矩阵上的所有对象T聚集到某个局部一维向量,然后返回迭代器。从这个向量或迭代器开始。结束这个向量

此外,我希望能够支持for-each循环如下:

for(const auto& obj : instaceOfMyClass)

谢谢!

共有1个答案

勾岳
2023-03-14

在我的脑海中,我想把矩阵上的所有对象T聚集到某个局部一维向量中,并将iterator.begin返回到这个向量中

这意味着复制整个矩阵。这是一个巨大的禁忌。不仅因为复制的时间,有效的空间翻倍,还因为你会在两个位置复制元素。当其中一个被修改时,另一个保留旧值。

你有两个选择:

template <class T>
class myClass{
    vector<T> matrix;

    T& get(size_t line, size_t column)
    {
         return matrix[line * columns_count + column];
    }
};

这有两个好处:更好的缓存局部性和易于实现的迭代器:

using ConstIterator = std::vector<T>::const_iterator;

ConstIterator cbegin() const { return matrix.cbegin(); }

如果你想保留2dim存储,那么你需要实现迭代器。对我来说,这有点太多样板了,所以如果你想走这条路,我会给你一个指导来让你开始:

迭代器应该保留一个指向矩阵的指针/引用、一个指向当前行的指针/引用/索引和一个指向当前列的指针/引用/索引。在操作中,在列上执行下一步操作,如果到达列的末尾,则增加行数并重置列。

 类似资料:
  • 本文向大家介绍C++ 向量迭代器,包括了C++ 向量迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 begin将an返回iterator到序列容器中的第一个元素。 end返回iterator末尾的第一个元素。 如果矢量对象const,无论是begin和end返回const_iterator。如果const_iterator即使向量不返回,也要返回const,则可以使用cbegin和cend。

  • 此代码未编译,因为被视为

  • 我正在使用SWI-Prolog为整数/ 1构建一些测试用例。 ISO/IEC 13211-1给出了的BNF定义,整数的替代方法之一是。 我能够使用 创建和测试所有其他替代方案的示例,但对于,我无法创建有效示例。(见下文) 如何创建一个整数作为,它将使用整数/1返回true? 答 感谢@false。 效用 感谢j4n bur53通过@false的链接 对于SWI-Prolog,除了2、8或16之外,

  • 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针。举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历。有这么几种迭代器如下: 迭代器 描述 input_iterator 提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。 output_iterator 提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*)。 forwar

  • 是否可以从迭代器创建一个流,其中对象的序列与通过反复调用迭代器的next()方法生成的序列相同?我所考虑的具体情况涉及到Treeset.desceningIterator()返回的迭代器的使用,但是我可以想象在其他情况下,迭代器是可用的,而不是它所引用的集合。 例如,对于,我们可以编写并按照该集合的排序顺序获取该集合中的对象流,但是如果我们希望它们按照不同的顺序,比如通过使用获得的顺序呢?我想象的

  • 当面对选择抛出异常的类型时,您可以使用由别人编写的异常 - Java平台提供了许多可以使用的异常类 - 或者您可以编写自己的异常类。 如果您对任何以下问题回答“是”,您应该编写自己的异常类;否则,你可以使用别人的。 你需要一个Java平台中没有表示的异常类型吗? 如果用户能够区分你的异常与由其他供应商编写的类抛出的异常吗? 你的代码是否抛出不止一个相关的异常? 如果您使用他人的例外,用户是否可以访