我必须创建一个为我创建一组字符的函数。我不确定我应该选择以下哪种方法。 据我所知,我不应该使用createSet1,因为如果在返回s之前出现问题,它将会泄漏。
set<char>* createSet1(){
set<char>* s = new set<char>;
//does something
return s;
}
set<char> createSet2(){
set<char> s;
//does something
return std::move(s);
}
unique_ptr<set<char>> createSet3(){
unique_ptr<set<char>> s(new set<char>);
//does something
return s;
}
如果有人可以解释我应该选择哪一个以及为什么会这样做,我会很高兴。
答案 0 :(得分:7)
以上都不是:
std::set<char> createSet() {
std::set<char> s;
// do something
return s;
}
没有理由动态分配集合,RVO会为您启动并删除副本,而无需支付额外动态分配和管理内存的成本。
现在针对一组字符的具体问题,你最好不要使用一个集合,而是正确调整std::vector
的大小:
class CharSet {
std::vector<bool> d_data; // std::vector<bool> quirks are fine here
void set(char ch, bool value) {
d_data[static_cast<unsigned char>(ch)] = value;
}
public:
CharSet() : d_data(std::numeric_limits<unsigned char>::max()+1) {}
void set(char ch) { set(ch,true); }
void unset(char ch) { set(ch,false); }
bool isset(char ch) const {
return d_data[static_cast<unsigned char>(ch)];
}
};
这种方法的优点是您要支付的成本较高的是std::set
中节点的动态分配,并且每个此类分配与{的情况下的单个分配相比具有成本。 {1}}(对于足够小的矢量)。 std::vector
的内存大约为32字节,与64位架构上std::vector<bool>
的单个节点相当。您甚至可以将其设为std::set
以避免std::vector<char>
的怪癖,它将是256个字符,这是该集合中几个节点的成本。
答案 1 :(得分:0)
std::set
是一个容器,这意味着您可以毫无问题地退回它,因此您可以将您的第一个提案修改为:
set<char> createSet1(){
set<char> s;
//does something with s
return s;
}
希望这有帮助