小编tjg*_*ant的帖子

C++ 11与C++ 98转换运算符的行为有何变化?

我希望在一些现有的c ++项目中使用一些c ++ 11特性,所以我开始在一些项目中更改Clang中的编译标志,并且我一直在遇到关于C++ 11处理转换操作符(或者转换)的特定问题运算符)我没想到会看到并且不明白为什么现在这被认为是一个错误,因为它是有效的C++代码而不是c ++ 11

我把它归结为这个简单的例子:

#include <iostream>
#include <vector>

class SerializableFormat
{
public:
    size_t i;
};

class A
{
public:
    size_t x, y;

    A(size_t n) : x(n), y(1) { }

    operator const SerializableFormat() const
    {
        SerializableFormat result;

        result.i = x;

        if (y)
        {
            result.i /= y;
        }

        return result;
    }
};

int main(int argc, const char * argv[])
{
    std::vector<SerializableFormat> v;

    for(size_t i = 0; i < 20; i++)
    {
        v.push_back(A(i));
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 如果Clang的编译标志设置为-std=c++98 …

c++ llvm libstdc++ c++11 libc++

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

非递归后序图遍历?

我正在寻找一些伪代码、算法或指南,以帮助我为广义图数据结构找到合适的迭代后序遍历算法。

\n\n

我发现了大量的资源(例如两栈或一栈算法)非常适合树,但对于图来说却很糟糕,因为它们无法处理循环/后边缘、交叉边缘等。

\n\n

我已经成功编写了一个递归后序图遍历算法,如下所示:

\n\n
template<typename V, typename E>\nvoid tGraph<V, E>::RecursivePostOrderSearch(const tGraph& g, const VertexType& u, std::set<VertexType>& visited, std::vector<VertexType>& result)\n{\n    if (visited.find(u) == visited.end())\n    {\n        visited.insert(u);\n\n        EdgeSet edgesOut = g.outgoingEdgesOf(u);\n\n        for(typename EdgeSet::const_iterator iter = edgesOut.begin(); iter != edgesOut.end(); iter++)\n        {\n            RecursivePostOrderSearch(g, iter->second.second, visited, result);\n        }\n\n        result.push_back(u);\n    }\n}\n\ntemplate<typename V, typename E> std::vector<V> tGraph<V, E>::postOrderList(const VertexType& v) const\n{\n    std::set<V> visited;\n    std::vector<V> result;\n\n    RecursivePostOrderSearch(*this, v, visited, result);\n\n    return result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中V是节点类型,E是边类型——“权重”对和传入/传出节点对。

\n\n

如果我在下图上运行::postOrderList(带有根节点A):

\n\n …

c++ iteration tree recursion graph-theory

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

如何在 bash 中同时循环多个通配符?

在 bash 中,我编写了一个函数,该函数使用通配符循环遍历具有多个扩展名的目录中的文件,并仅复制这些特定文件(如果存在)。代码片段如下所示:

set -e

pushd ../../../../$3/code/project/common/ > /dev/null
mkdir -p ../$2
shopt -s nullglob

for file in *.gyp; do   cp $file ../$2/; done
for file in *.gypi; do  cp $file ../$2/; done
for file in *.sh; do    cp $file ../$2/; done
for file in *.patch; do cp $file ../$2/; done

popd > /dev/null
Run Code Online (Sandbox Code Playgroud)

我更愿意编写一条for file in x语句,这样我就不必为我想要复制的每个扩展名复制并粘贴这一行。

如何将这四个for语句重写为一个for语句?如果可能的话,我想将*.ext通配符格式保留在其中。

bash shell for-loop wildcard

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

GitLab CE:如何恢复或修复突然丢失的问题/合并请求的存储库?

大约两年前,我开始在本地 x86 Debian VM 内运行 GitLab CE,去年我决定将 GitLab CE 实例迁移到专用的 Intel NUC 服务器。一切似乎都很顺利,没有任何问题,并且我的 GitLab CE 实例截至今天是最新的(运行 13.4.2)。

但我最近发现,一些被移动的存储库给出了“没有存储库!” 访问他们的项目页面时出错,如果他们有任何问题板、合并请求等,这些也都消失了。但您不会怀疑它,因为损坏的存储库与我一直使用的工作存储库一起出现在存储库列表中。

如果我必须对这些损坏的存储库进行推理,那就是它们在一年前进行了最后一次活动,除了初始推送之外,没有对它们进行任何推送,或者是否进行了更改、创建了问题或合并请求创建,它实际上是一年多前。

其中一些损坏的存储库相当大,有很多历史记录,而其他存储库则非常小(实际上只是跟踪 shell 脚本的更改),所以我认为存储库大小本身与此没有任何关系。

如果我运行 GitLab 诊断检查sudo gitlab-rake gitlab:check,除了“散列存储”之外,一切看起来都很好:

All projects are in hashed storage? ... no
  Try fixing it:
  Please migrate all projects to hashed storage
Run Code Online (Sandbox Code Playgroud)

但随后运行sudo gitlab-rake gitlab:storage:migrate_to_hashed似乎没有完成(仪表板中有六个失败的作业),并且再次运行“gitlab:check”仍然表明存在“散列存储”问题。我也尝试过运行sudo gitlab-rake gitlab:git:fscksudo gitlab-rake cache:clear但这些命令似乎没有什么区别。

幸运的是,我的机器上有所有缺少的存储库的最新版本,事实上,我仍然有运行 GitLab CE 12.8.5 的原始虚拟机(存储库的副本稍微过时了。)

所以我的问题是:

  1. 是否可以“修复”我当前实例上损坏的存储库?我怀疑我可以将这些存储库的本地副本“重新推送”回我的服务器,但我真的不想丢失任何元数据,例如问题/合并请求等。
  2. 有没有办法解决“并非所有项目都在哈希存储中”的问题?(migrate_to_hashed任务再次未能完成。)
  3. 我是否能够执行“备份”、“检查/调整备份”、“恢复备份”之类的操作来修复损坏的存储库,或者至少修复元数据?

提前致谢。

gitlab gitlab-ce

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