假设我想在C++中实现一个数据结构来存储面向图.由于STL容器,Arcs将存储在节点中.我希望用户能够以类似STL的方式迭代节点的弧.
我遇到的问题是我不希望在Node类(实际上是一个抽象基类)中公开我将在具体类中实际使用的STL容器.因此,我不希望我的方法返回std :: list :: iterator或std :: vector :: iterator ...
我试过这个:
class Arc;
typedef std::iterator<std::random_access_iterator_tag, Arc*> ArcIterator; // Wrong!
class Node {
public:
ArcIterator incomingArcsBegin() const {
return _incomingArcs.begin();
}
private:
std::vector<Arc*> _incomingArcs;
};
Run Code Online (Sandbox Code Playgroud)
但这不正确,因为vector :: const_iterator不能用于创建ArcIterator.那么这个ArcIterator可以是什么?
我发现这篇论文关于STL的自定义迭代器,但它没有帮助.我今天一定有点沉重......;)
在下面的C++代码中,模板化的Check函数给出的输出不是我想要的:它是1而不是3.我怀疑K映射到int*,而不是int[3](是一个类型?).我希望它给出与第二个(非模板化)函数相同的输出,我明确给出了数组的大小...
如果没有使用宏,有没有办法编写一个接受单个参数但仍知道数组大小的Check函数?
#include <iostream>
using namespace std;
int data[] = {1,2,3};
template <class K>
void Check(K data) {
cout << "Deduced size: " << sizeof(data)/sizeof(int) << endl;
}
void Check(int*, int sizeofData) {
cout << "Correct size: " << sizeofData/sizeof(int) << endl;
}
int main() {
Check(data);
Check(data, sizeof(data));
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
PS:在实际代码中,数组是一个结构数组,必须迭代才能进行单元测试.
我正在学习 Effective Python(第 2 版)中的第 76 条,但遇到了一个我不理解的案例。具体来说,我不明白为什么要zip消耗其第一个参数的一个额外元素。考虑以下代码:
l1 = []
l2 = [1]
l1_it = iter(l1)
l2_it = iter(l2)
test_it = zip(l2_it, l1_it)
_ = list(test_it):
try:
next(l2_it)
except StopIteration:
print('This should not happen')
Run Code Online (Sandbox Code Playgroud)
这实际上打印This should not happen,我觉得这非常令人惊讶。我希望zip将其第一个参数保留在仍有一个元素要检索的状态。事实是,如果我使用zip(l1_it, l2_it)(即最短的列表在前),那么我确实可以在next(l2_it)不触发异常的情况下调用。
这是预期的吗?
我的(第一个!)Python程序中有两个函数,只有必须实例化的类才有所不同.
def f(id):
c = ClassA(id)
...
return ...
def g(id):
c = ClassB(id)
...
return ...
Run Code Online (Sandbox Code Playgroud)
为了避免重复代码,我希望能够编写一个单独的函数,以某种方式接受该类作为参数进行实例化.
def f(id):
return f_helper(id, ... ClassA ...)
def g(id):
return f_helper(id, ... ClassB ...)
def f_helper(id, the_class):
c = ... the_class ... (id)
...
return ...
Run Code Online (Sandbox Code Playgroud)
我很确定这是可能的,但没有找到......