为什么以下代码有效呢?
struct A {
std::vector<A> subAs;
};
Run Code Online (Sandbox Code Playgroud)
A是不完整的类型,对吧?如果有一个A*s的矢量我会理解.但在这里,我不明白它是如何工作的.它似乎是一个递归的定义.
我的目标是将类型的元素映射到相同类型的其他元素.假设它们是size_t为了简单起见.
std::map<size_t, size_t> myMapping;
Run Code Online (Sandbox Code Playgroud)
这样做,但如果我想跟随一堆这样的链接(它们都是相同的地图),每一步都是log(n)查找.
size_t k = /*whatever*/;
myMapping[myMapping[myMapping[k]]]; //3 * log(n)
Run Code Online (Sandbox Code Playgroud)
我想利用map迭代器保持有效的事实,并有一个映射将size_t映射到迭代器的映射.
typedef /*myMapTemplate*/::iterator map_iter;
std::map<size_t, map_iter> myMapping;
size_t k = /*whatever*/
map_iter entryPoint = myMapping.find(k);
entryPoint->second->second->first; //log(n) + 2 constant time operations
Run Code Online (Sandbox Code Playgroud)
我该怎么写这种类型?我知道复制会将迭代器保留在旧地图上并计划自己处理.
我最近查看了一些代码并发现了类似于以下内容的数据结构:
class TreeNode {
std::vector<TreeNode> subNodes;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,在定义TreeNode之前,使用TreeNode实例化容器.代码在GCC和MSVC下编译,但我记得看到有人说这不是保证行为.不幸的是,我根本无法在标准中找到任何内容.
这些容器如何实施?标准是否保证了这种行为?如果标准不能保证这一点,我对这种设计有什么选择?
我想写一个模板,得到的容器模板参数(如vector,set,unordered_set)和类型T,并返回一个双向链表的容器,也就是容器的每个项目应该包含三层:
T prev迭代器,指向一些其他的三倍Tnext迭代器,指向一些其他的三倍T这类似于以下内容:
template <template <class Tr> class Container, class T>
struct Triple {
T value;
typename Container< Triple<Container, T> >::iterator prev, next;
};
template <template <class Tr> class Container, class T>
using DoublyLinkedContainer = Container< Triple< Container, T> >;
#include <vector>
// default partial specialisation of the Allocator parameter
template <class T> using SimpleVector = std::vector<T>;
DoublyLinkedContainer<SimpleVector, int> v;
Run Code Online (Sandbox Code Playgroud)
它似乎被编译器(gcc和clang)所接受,但我无法理解我是否正在调用未定义的行为,因为在 Are C++递归类型定义中可能,特别是我可以将vector …
为什么下面的代码有效?struct test 包含一个 test 向量,以便编译以下代码(IDEOne):
#include <iostream>
#include <vector>
using namespace std;
struct test {
vector<test> a;
};
int main() {
// your code goes here
test t;
if (t.a.size() > 0)
return -1;
else if (t.a[0].a[0].a.size() > 0)
return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器如何处理结构以便可以测试t.a[0].a[0].a.size()?我可以重复的频率有限制.a[0]吗?
编辑:这个问题的答案声称这是未定义的行为:C++ 递归类型定义是否可能,特别是我可以在 T 的定义中放置一个 vector<T> 吗?
=> 这令人困惑
=> 也许我的问题是重复的
昨天我问了以下问题,为方便起见,转载于此;
"对于我的一个项目,我真正想做的就是这样做(将其简化为最低限度);
struct Move
{
int src;
int dst;
};
struct MoveTree
{
Move move;
std::vector<MoveTree> variation;
};
Run Code Online (Sandbox Code Playgroud)
我必须承认,我认为不可能直接这样做,我认为MoveTree中的MoveTree矢量将被禁止.但无论如何我都试过了,它的效果非常好.我正在使用Microsoft Visual Studio 2010 Express.
这是便携式吗?这是好习惯吗?我有什么值得担心的吗?"
基本上社区的答案是否定的,我不能这样做,标准禁止它,所以它有效的事实意味着我很幸运.
所以我的新问题是.如何在合法的C++中实现我想要的简单功能,而不会增加一堆令人讨厌的复杂性和痛苦?