小编Edi*_*enz的帖子

我需要手动关闭ifstream吗?

close()我使用时需要手动拨打电话std::ifstream吗?

例如,在代码中:

std::string readContentsOfFile(std::string fileName) {

  std::ifstream file(fileName.c_str());

  if (file.good()) {
      std::stringstream buffer;
      buffer << file.rdbuf();
      file.close();

      return buffer.str();
  }
  throw std::runtime_exception("file not found");
}
Run Code Online (Sandbox Code Playgroud)

我需要file.close()手动拨打电话吗?不应该ifstream使用RAII来关闭文件?

c++ raii ifstream

187
推荐指数
5
解决办法
6万
查看次数

忽略Jackson的序列化特定字段

我正在使用杰克逊图书馆.

我想在序列化/反序列化时忽略特定字段,例如:

public static class Foo {
    public String foo = "a";
    public String bar = "b";

    @JsonIgnore
    public String foobar = "c";
}
Run Code Online (Sandbox Code Playgroud)

应该给我:

{
foo: "a",
bar: "b",
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了:

{
foo: "a",
bar: "b",
foobar: "c"
}
Run Code Online (Sandbox Code Playgroud)

我正在用这段代码序列化对象:

ObjectMapper mapper = new ObjectMapper();
String out = mapper.writeValueAsString(new Foo());
Run Code Online (Sandbox Code Playgroud)

我的类中字段的真实类型是Log4J Logger类的实例.我究竟做错了什么?

java serialization json jackson

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

使用realloc与free - > malloc函数之间的差异

为什么在再次调用malloc()函数之前使用realloc()函数来调整动态分配的数组的大小而不是使用free()函数(即优缺点,优点与缺点等)?这是C编程,但我找不到合适的标签.提前致谢.

c memory-management

34
推荐指数
3
解决办法
2万
查看次数

如何使std :: vector的operator []编译在DEBUG中进行边界检查,但不在RELEASE中进行

我正在使用Visual Studio 2008.

我知道std :: vector已经使用at()函数进行边界检查,并且如果您尝试使用operator []错误地访问某些内容(超出范围),则会有未定义的行为.

我很好奇是否可以使用边界检查来编译我的程序.这样,operator []将使用at()函数,并在某些事物超出范围时抛出std :: out_of_range.

将在没有边界检查operator []的情况下编译释放模式,因此性能不会降低.

我开始考虑这个问题,因为我正在将使用Borland C++编写的应用程序迁移到Visual Studio,并且在我的代码的一小部分中将其迁移(i = 0,j = 1):

v[i][j]; //v is a std::vector<std::vector<int> >
Run Code Online (Sandbox Code Playgroud)

向量'v'的大小为[0] [1](因此向量的元素0只有一个元素).这是未定义的行为,我知道,但是Borland在这里返回0,VS正在崩溃.我喜欢崩溃比返回0更好,所以如果我可以通过抛出std :: out_of_range异常得到更多'崩溃',迁移将更快完成(因此它会暴露更多Borland隐藏的错误).

c++ visual-studio-2008 bounds-checker

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

.NET几何库

我在.NET中开始一个新项目,需要一些几何算法,例如:

  • 检查点是否在多边形内
  • 贝塞尔曲线
  • 线路交叉口等

我找到了一些图书馆,但它们付费/昂贵,包括:

这些就是我需要的东西以及更多,这使我花费太多的钱在一些不会被这么多使用的东西上.

我发现了一些开源项目:

但是这些比我需要的少,但是,当你在谷歌上看时,它们很容易找到.经过一段时间的搜索,我找到了这个库:

哪个是我需要的大部分内容.它也是免费的,并按"原样"提供.这很好.

但是,如果您搜索谷歌"Tektosyne",您会发现很少的结果.所以我的问题是(对于那些在C#of StackOverflow中有一些"高级"几何使用经验的人):

你有另外的图书馆推荐或为什么这个图书馆不"受欢迎"?

c# geometry

21
推荐指数
2
解决办法
2万
查看次数

vector :: erase和std :: remove_if的奇怪行为,其结束范围与vector.end()不同

我需要从std :: vector的中间删除元素.

所以我尝试过:

struct IsEven {
    bool operator()(int ele)
    {
        return ele % 2 == 0;
    }
};

    int elements[] = {1, 2, 3, 4, 5, 6};
    std::vector<int> ints(elements, elements+6);

    std::vector<int>::iterator it = std::remove_if(ints.begin() + 2, ints.begin() + 4, IsEven());
    ints.erase(it, ints.end());
Run Code Online (Sandbox Code Playgroud)

在此之后我会期望ints向量具有:[1,2,3,5,6].

在Visual Studio 2008的调试器中,std::remove_if在行之后,元素ints被修改,我猜我在这里遇到某种未定义的行为.

那么,如何从矢量范围中删除元素?

c++ stl

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

MKL或BLAS例程将矢量乘以标量不合适的位置

我在模拟软件中工作,在阵列上完成的许多操作之一是按数字缩放矢量.

我有这样的代码:

//Just some initialization code, don't bother about this part
int n = 10000;
std::vector<double> input(n, 42.0);
std::vector<double> output(input.size());

double alpha = 69.0;

//the actual calculation:
for (size_t i = 0; i < n; ++i) {
    output[i] = input[i] * alpha;
}
Run Code Online (Sandbox Code Playgroud)

我有MKL库,所以如果我的计算是"就地"完成的,可以写下面的内容:

cblas_dscal(n, alpha, &input[0], 1);
Run Code Online (Sandbox Code Playgroud)

但是,这会改变input变量,这不是我想要的.

我试过使用mkl_domatcopy()但是这个操作非常慢.

c c++ performance blas intel-mkl

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

链接库中的库和.exe在Visual Studio中的调试崩溃

我正在使用Visual C++ 2008 SP1.我有一个在调试模式下编译的应用程序,但在发布模式下链接到库.

我在启动应用程序时遇到了崩溃.为了缩小问题,我创建了一个包含2个项目的简单解决方案:

  • lib_release(在发布模式下生成.lib)
  • exec_using_lib_release(在调试模式下生成.exe)

'lib_release'项目非常简单,只需要一个简单的类:

//Foo.h
#include <vector>
class Foo {
  std::vector<int> v;
  public:
  void doSomething();
};
//Foo.cpp
#include "Foo.h"
void Foo::doSomething() {}
Run Code Online (Sandbox Code Playgroud)

'exec_using_lib_release'项目很简单,如下所示:

//main.cpp
#include "Foo.h"
int main() {
   Foo foo;
   foo.doSomething();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它崩溃,这是由如何针对发布版本的lib(MSVCRT.lib)构建调试.exe(MSVCRTD.lib)报告的相同问题,但他的回答对我不起作用.

我得到了相同的链接器警告,我尝试了相同的步骤,但没有一个工作.有什么我想念的吗?

编辑:

在lib_release(在发布模式下创建一个库),我正在使用Multi Threaded(/ MT),在exec_using_lib_release,我正在使用多线程调试(/ MTd).我认为这是实现它的预期方式,因为我希望在没有调试信息的情况下创建.lib.我在MSDN运行时库中阅读了该文档,这些是以静态方式链接CRT的设置.

我也没有"公共语言运行时支持".

c++ linker visual-studio-2008 visual-studio

6
推荐指数
2
解决办法
9648
查看次数

是否有一个插件可以与VS2008或Eclipse CDT集成到CPPUnit?

我们有一些项目有CPPUnit测试,这些测试是使用ant脚本构建和运行来构建它们的(现在我们正在使用Borland C++,但我们正在转向VS2008).

问题是运行和查看测试结果的界面是令人不愉快的(命令提示符).让它们在eclipse或VS2008中运行会很棒.

如果一个插件我可以选择我想要运行的测试并获得一些视觉反馈(绿色条/红色条),指向我失败的测试和消息,这将好得多.

这与Eclipse中的JUnit(对于java)存在,但对于使用Eclipse CDT或VS2008的C++有类似的东西吗?UI测试运行器也很有用,因此我可以将UI作为Post构建操作启动.

编辑(可能的答案):

我找到了这个项目:ECUT,但我还没有测试过.看起来很有前途.一旦我获得了项目的更多经验,我就会更新这个问题.

c++ eclipse user-interface unit-testing visual-studio-2008

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

将智能指针作为参数传递给类:scoped_ptr或shared_ptr?

我有一个类在一个公共方法中创建一个对象.该对象是私有的,对于该类的用户不可见.然后,此方法调用同一个类中的其他私有方法,并将创建的对象作为参数传递:

class Foo {
   ...
};

class A {
   private:
      typedef scoped_ptr<Foo> FooPtr;

      void privateMethod1(FooPtr fooObj);

   public:
      void showSomethingOnTheScreen() {
          FooPtr fooObj(new Foo);
          privateMethod1(fooObj);
      };
};
Run Code Online (Sandbox Code Playgroud)

我相信在这种情况下正确的智能指针将是一个scoped_ptr,但是,我不能这样做因为scoped_ptr使该类不可复制,如果以这种方式使用,所以我应该这样做的方法:

void privateMethod1(FooPtr& fooObj);
Run Code Online (Sandbox Code Playgroud)

privateMethod1不存储对象,也不保留对它的引用.只需从类Foo中检索数据.

正确的方法可能是根本不使用智能指针并在堆栈中分配对象,但这是不可能的,因为它使用的库不允许堆栈上的对象,它们必须位于堆上.

毕竟,我仍然对scoped_ptr的实际用法感到困惑.

c++ boost class smart-pointers

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