小编Ale*_*ino的帖子

转换大约150mb的字符串的快速方法

我一直在试图减少每char一个值std::stringstream的100:

std::string str = stream.str();

auto decrement = [](char c) { return c - 100; };

std::string out;
out.reserve(str.size());
std::transform(str.begin(), str.end(), std::back_inserter(out), decrement);

stream = std::stringstream(out);
Run Code Online (Sandbox Code Playgroud)

但它花了7分钟坚持了std::transform指令.那是一个150mb的文本文件.

我没有使用优化版本.这是调试版本.目标是能够使代码运行得更快,以便进行调试.发布结果是此问题的次要结果.

关于如何提高效率的任何建议?

c++ performance c++11

12
推荐指数
2
解决办法
729
查看次数

将"this"作为参数传递给自己的构造函数是不好的做法?

我有这个BdlTabItem接收类型的参数,DockableUserControl并想知道通过使用uc.TabItem = this和new BdlDockableWindow(this)在构造函数完成之前在两者之间创建循环引用是不好的做法.

我知道使用非托管本机代码(C++)可以认为这种行为非常糟糕.所以,即使我没有任何警告或错误,我在这里问我是否应该这样做.

public BdlTabItem(BdlTabControl parent, DockableUserControl uc, string title)
    {
        TabControlParent = parent;
        UserControl = uc;
        WindowParent = new BdlDockableWindow(this);

        this.Content = UserControl;

        UserControl.TabItem = this;
    }
Run Code Online (Sandbox Code Playgroud)

.net c#

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

有没有办法让这种最短路径算法更快?

使用CGAL lib,我正在尝试实现最短路径方法.

我已经取得了一定的成功,但是映射路径所需的时间几乎不可接受,在Release中运行最多需要1.5秒.

我知道输入可能非常大,有50000个面孔,但这是我必须要处理的.

更详细地说明我正在尝试做的是能够通过单击两个不同的位置并沿着网格的表面绘制样条曲线,并从它们生成路径,就像在图像中一样:在此输入图像描述

我的类型定义是:

typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Surface_mesh<Kernel::Point_3> Triangle_mesh;
typedef CGAL::Surface_mesh_shortest_path_traits<Kernel, Triangle_mesh> Traits;
// default property maps
typedef boost::property_map<Triangle_mesh,
    boost::vertex_external_index_t>::type  Vertex_index_map;
typedef boost::property_map<Triangle_mesh,
    CGAL::halfedge_external_index_t>::type Halfedge_index_map;
typedef boost::property_map<Triangle_mesh,
    CGAL::face_external_index_t>::type     Face_index_map;
typedef CGAL::Surface_mesh_shortest_path<Traits> Surface_mesh_shortest_path;
typedef boost::graph_traits<Triangle_mesh> Graph_traits;
typedef Graph_traits::vertex_iterator vertex_iterator;
typedef Graph_traits::halfedge_iterator halfedge_iterator;
typedef Graph_traits::face_iterator face_iterator;
Run Code Online (Sandbox Code Playgroud)

我的代码如下所示:

Traits::Barycentric_coordinates src_face_location = { { p1.barycentric[2], p1.barycentric[0], p1.barycentric[1] } };
face_iterator src_face_it = faces(map->m_cgal_mesh).first;
std::advance(src_face_it, src_faceIndex);

map->m_shortest_paths->remove_all_source_points();
map->m_shortest_paths->add_source_point(*src_face_it, src_face_location);

Traits::Barycentric_coordinates dest_face_location = { { p2.barycentric[2], …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm path-finding cgal

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

使用 Phong 方法的不良照明

我正在尝试制作一个立方体,它是不规则的三角剖分,但几乎共面,阴影正确。

这是我目前的结果: 在此处输入图片说明

带线框:

在此处输入图片说明

在我的程序中计算的法线:

在此处输入图片说明

由 meshlabjs.net 计算的法线:

在此处输入图片说明

当为立方体使用常规大小的三角形时,照明工作正常。如您所见,我正在复制顶点并使用角度权重。

lighting.frag

vec4 scene_ambient = vec4(1, 1, 1, 1.0);

struct material
{
  vec4 ambient;
  vec4 diffuse;
  vec4 specular;
  float shininess;
};

material frontMaterial = material(
  vec4(0.25, 0.25, 0.25, 1.0),
  vec4(0.4, 0.4, 0.4, 1.0),
  vec4(0.774597, 0.774597, 0.774597, 1.0),
  76
);

struct lightSource
{
  vec4 position;
  vec4 diffuse;
  vec4 specular;
  float constantAttenuation, linearAttenuation, quadraticAttenuation;
  float spotCutoff, spotExponent;
  vec3 spotDirection;
};

lightSource light0 = lightSource(
  vec4(0.0,  0.0, 0.0, 1.0),
  vec4(100.0,  100.0,  100.0, 100.0),
  vec4(100.0,  100.0,  100.0, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader cgal phong

7
推荐指数
2
解决办法
380
查看次数

EditorFor的最小值和最大值

我一直在尝试使用此代码来设置我的最小值和最大值EditorFor:

<label id="LbStartYear" style="width: 200px">From Date: @Html.EditorFor(model => model.SelectedYearBegin, new { htmlAttributes = new { @min = "0", @max = "20" } })</label>
Run Code Online (Sandbox Code Playgroud)

但没有成功.永远不会设置最小值和最大值.我尝试删除引用,0并20尝试使用和不使用@.

有任何想法吗?

asp.net asp.net-mvc razor asp.net-mvc-5

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

迭代时从std :: list中删除

我有以下代码:

bool resetTypeBit = true;
for (auto it = eventsList.begin(); it != eventsList.end(); ++it) {
    CreatureEvent* curEvent = *it;
    if (curEvent == event) {
        it = eventsList.erase(it);
    } else if (curEvent->getEventType() == type) {
        resetTypeBit = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我有以下场景:eventList包含01项,然后,一旦for语句第一次通过并遇到该it = eventsList.erase(it);行,it变量就变为无效,导致for语句的下一次迭代出现分段错误.

什么可能导致问题的线索?

c++ stl list c++11

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

将右值元组转换为左值元组

如果我把整个概念弄错了,我很抱歉,但我正在尝试将一个元组作为实际对象的容器,只有在销毁这些对象时,这些对象才会超出范围。

我目前有这个:

class MiniThread {
public:
    ~MiniThread() {
        if (m_thread) {
            if (m_thread->joinable())
                m_thread->join();

            delete m_thread;
        }
    }

    void join()
    {
        if (m_thread == nullptr)
            return;

        m_thread->join();
        m_thread = nullptr;
    }

    template<typename F, typename... Args>
    void run(F func, Args... args)
    {
        if (m_thread != nullptr)
            join();

        auto tuple = std::forward_as_tuple(args...);

        m_thread = new std::thread([=]() {
            __try
            {
                std::apply(func, tuple);
            }
            __except (CrashDump::GenerateDump(GetExceptionInformation()))
            {
                // TODO: log.
                exit(1);
            }
        });

        m_started = true;
    }

    bool started() const { return m_started; } …
Run Code Online (Sandbox Code Playgroud)

c++ tuples variadic-templates c++17

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