小编Fra*_*ank的帖子

如何更新std :: set的现有元素?

我有一个std::set<Foo>,我想更新其中现有元素的一些值.请注意,我正在更新的值不会更改集合中的顺序:

#include <iostream>
#include <set>
#include <utility>

struct Foo {
  Foo(int i, int j) : id(i), val(j) {}
  int id;
  int val;
  bool operator<(const Foo& other) const {
    return id < other.id;
  }
};

typedef std::set<Foo> Set;

void update(Set& s, Foo f) {
  std::pair<Set::iterator, bool> p = s.insert(f);
  bool alreadyThere = p.second;
  if (alreadyThere)
    p.first->val += f.val; // error: assignment of data-member
                           // ‘Foo::val’ in read-only structure
}

int main(int argc, char** argv){
  Set s;
  update(s, Foo(1, 10)); …
Run Code Online (Sandbox Code Playgroud)

c++ stl set

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

如何使用菱形运算符(<>)读取UTF-8?

我想在Perl中读取UTF-8输入,无论它来自标准输入还是来自文件,使用菱形运算符:while(<>){...}.

所以我的脚本应该像往常一样以这两种方式调用,给出相同的输出:

./script.pl utf8.txt
cat utf8.txt | ./script.pl
Run Code Online (Sandbox Code Playgroud)

但产出不同!只有第二次调用(使用cat)似乎按设计工作,正确读取UTF-8.这是脚本:

#!/usr/bin/perl -w

binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';

while(<>){
    my @chars = split //, $_;
    print "$_\n" foreach(@chars);
}
Run Code Online (Sandbox Code Playgroud)

在两种情况下如何才能正确读取UTF-8?<>如果可能的话,我想继续使用钻石操作员进行阅读.

编辑:

我意识到我应该描述不同的输出.我的输入文件包含以下序列:a\xCA\xA7b.cat正确输出的方法:

a
\xCA\xA7
b
Run Code Online (Sandbox Code Playgroud)

但另一种方法给了我这个:

a
\xC3\x8A
\xC2\xA7
b
Run Code Online (Sandbox Code Playgroud)

unicode perl input utf-8

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

可选函数参数:使用默认参数(NULL)或重载函数?

我有一个处理给定向量的函数,但如果没有给出,也可以自己创建这样的向量.

我看到这种情况有两种设计选择,其中一个函数参数是可选的:

将它设为指针并NULL默认设置为:

void foo(int i, std::vector<int>* optional = NULL) {
  if(optional == NULL){
    optional = new std::vector<int>();
    // fill vector with data
  }
  // process vector
}
Run Code Online (Sandbox Code Playgroud)

或者有两个带有重载名称的函数,其中一个省略了参数:

void foo(int i) {
   std::vector<int> vec;
   // fill vec with data
   foo(i, vec);
}

void foo(int i, const std::vector<int>& optional) {
  // process vector
}
Run Code Online (Sandbox Code Playgroud)

是否有理由选择一种解决方案而不是另一种?

我稍微偏爱第二个,因为我可以将向量作为const引用,因为它在提供时只能读取而不能写入.此外,界面看起来更干净(NULL不仅仅是一个黑客?).并且间接函数调用产生的性能差异可能会被优化掉.

然而,我经常在代码中看到第一个解决方案.除了程序员的懒惰之外,是否有令人信服的理由更喜欢它?

c++ parameters null overloading function

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

我可以通过添加一个数字来增加迭代器吗?

我可以使用迭代器进行正常计算,即只需通过添加数字来增加它吗?

例如,如果我想删除元素vec[3],我可以这样做:

std::vector<int> vec;
for(int i = 0; i < 5; ++i){
      vec.push_back(i);
}
vec.erase(vec.begin() + 3); // removes vec[3] element
Run Code Online (Sandbox Code Playgroud)

它适用于我(g ++),但我不确定它是否可以保证工作.

c++ iterator

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

模板或抽象基类?

如果我想使类适应,并且可以从外部选择不同的算法 - C++中最好的实现是什么?

我主要看到两种可能性:

  • 使用抽象基类并传递具体对象
  • 使用模板

这是一个小例子,在各种版本中实现:

版本1:抽象基类

class Brake {
public: virtual void stopCar() = 0;  
};

class BrakeWithABS : public Brake {
public: void stopCar() { ... }
};

class Car {
  Brake* _brake;
public:
  Car(Brake* brake) : _brake(brake) { brake->stopCar(); }
};
Run Code Online (Sandbox Code Playgroud)

版本2a:模板

template<class Brake>
class Car {
  Brake brake;
public:
  Car(){ brake.stopCar(); }
};
Run Code Online (Sandbox Code Playgroud)

版本2b:模板和私有继承

template<class Brake>
class Car : private Brake {
  using Brake::stopCar;
public:
  Car(){ stopCar(); }
};
Run Code Online (Sandbox Code Playgroud)

来自Java,我自然倾向于始终使用版本1,但模板版本似乎经常是首选,例如在STL代码中?如果这是真的,是因为内存效率等(没有继承,没有虚函数调用)?

我意识到版本2a和2b之间没有太大的区别,请参阅C++ …

c++ templates abstract-class design-patterns virtual-functions

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

如何为临时文件创建std :: ofstream?

好的,mkstemp是在POSIX中创建临时文件的首选方法.

但它会打开文件并返回一个int文件描述符.从那以后我只能创建一个FILE*,而不是一个std::ofstream,我更喜欢C++.(显然,在AIX和其他一些系统上,您可以std::ofstream从文件描述符创建一个,但是当我尝试时,我的编译器会抱怨.)

我知道我可以获得一个临时文件名,tmpnam然后用它打开我自己的ofstream,但由于竞争条件,这显然是不安全的,并导致编译器警告(Linux上的g ++ v3.4.):

warning: the use of `tmpnam' is dangerous, better use `mkstemp'
Run Code Online (Sandbox Code Playgroud)

那么,是否有任何可移植的方法来创建std::ofstream临时文件?

c++ file-io file mkstemp

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

您在R中使用哪些最佳实践进行编程?

编程有哪些好的做法R

由于R我不是一直使用的特殊用途语言,我通常只是将一些快速脚本组合在一起,以满足我的需求.

但是编写干净,高效的R代码有哪些技巧?

r

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

定义自己的异常类的最佳实践?

我有一些特殊的异常情况,我想抛出并捕获,所以我想定义自己的异常类.

有什么最好的做法?我应该继承std::exception还是std::runtime_error

c++ error-handling inheritance exception

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

我应该使用const作为局部变量来进行更好的代码优化吗?

我经常使用const未修改的局部变量,如下所示:

const float height = person.getHeight();
Run Code Online (Sandbox Code Playgroud)

我认为它可以使编译后的代码更快,允许编译器进行更多优化.或者我错了,编译器可以自己弄清楚局部变量永远不会被修改?

c++ optimization performance const compiler-optimization

33
推荐指数
2
解决办法
9822
查看次数

Go的多线程和pthread或Java线程有什么区别?

Go的多线程方法和其他方法有什么区别,比如pthread,boost :: thread或Java Threads?

c++ java multithreading pthreads go

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