相关疑难解决方法(0)

如何声明同一个类的成员向量?

为什么以下代码有效呢?

struct A {
    std::vector<A> subAs;
};
Run Code Online (Sandbox Code Playgroud)

A是不完整的类型,对吧?如果有一个A*s的矢量我会理解.但在这里,我不明白它是如何工作的.它似乎是一个递归的定义.

c++ templates vector member incomplete-type

46
推荐指数
1
解决办法
2254
查看次数

std ::迭代器映射到它自己

我的目标是将类型的元素映射到相同类型的其他元素.假设它们是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)

我该怎么写这种类型?我知道复制会将迭代器保留在旧地图上并计划自己处理.

c++ dictionary iterator stl std

10
推荐指数
1
解决办法
1336
查看次数

C++中的递归容器?

可能重复:
C++递归类型定义是否可行,特别是我可以在T的定义中放置vector <T>吗?

我最近查看了一些代码并发现了类似于以下内容的数据结构:

class TreeNode {
    std::vector<TreeNode> subNodes;
};
Run Code Online (Sandbox Code Playgroud)

如您所见,在定义TreeNode之前,使用TreeNode实例化容器.代码在GCC和MSVC下编译,但我记得看到有人说这不是保证行为.不幸的是,我根本无法在标准中找到任何内容.

这些容器如何实施?标准是否保证了这种行为?如果标准不能保证这一点,我对这种设计有什么选择?

c++ recursion containers

5
推荐指数
1
解决办法
775
查看次数

将迭代器放在其中的容器中

我想写一个模板,得到的容器模板参数(如vector,set,unordered_set)和类型T,并返回一个双向链表的容器,也就是容器的每个项目应该包含三层:

  • 一个 T
  • 一个prev迭代器,指向一些其他的三倍T
  • 一个next迭代器,指向一些其他的三倍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 …

c++ containers iterator undefined-behavior c++11

5
推荐指数
1
解决办法
194
查看次数

C++ 递归类型定义

为什么下面的代码有效?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> 吗?

=> 这令人困惑

=> 也许我的问题是重复的

c++

5
推荐指数
1
解决办法
940
查看次数

如何在C++中模拟递归类型定义?

昨天我问了以下问题,为方便起见,转载于此;

"对于我的一个项目,我真正想做的就是这样做(将其简化为最低限度);

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++中实现我想要的简单功能,而不会增加一堆令人讨厌的复杂性和痛苦?

c++ design-patterns

2
推荐指数
1
解决办法
863
查看次数

用C++实现树

我正在尝试为C++ Linux项目实现通用的分层树.

但是,我无法找到任何标准的库树容器.

有存在吗?

蒂姆,提前谢谢

c++ linux

1
推荐指数
1
解决办法
1680
查看次数