我有一个文件说somefile.txt
它按排序顺序包含名称(单个单词)。
我希望在按照排序顺序添加新名称后更新此文件。
以下哪种方式最受欢迎?为什么?
使用std::multiset
std::multiset<std::string> s;
std::copy(std::istream_iterator<std::string>(fin),//fin- object of std::fstream
std::istream_iterator<std::string>(),
std::inserter(s, s.begin()));
s.insert("new_name");
//Write s to the file
OR
使用std::vector
std::vector<std::string> v;
std::copy(std::istream_iterator<std::string>(fin),
std::istream_iterator<std::string>(),
std::back_inserter(v));
v.push_back("new_name");
std::sort(v.begin(),v.end());
//Write v to the file.
答案 0 :(得分:6)
多重插件插入对象的速度比向量慢,但它们保持排序。 多集合可能占用比向量更多的内存,因为它必须保存指向内部树结构的指针。这可能并非总是如此,因为向量可能有一些空的空间。
我想如果你需要增量增长的信息,但总是准备立即访问,那么多组胜利。
如果您一次性收集数据而无需按顺序访问它,则将其推送到向量然后排序可能更简单。因此,存储数据的动态性是真正的标准。
答案 1 :(得分:2)
这两个选项基本相同。
在性能关键的情况下,vector
方法会更快,但在这种情况下,你的性能基本上会受到磁盘的限制;你选择哪个容器并不重要。
答案 2 :(得分:2)
std::string new_name = "new_name";
bool inserted = false;
std::string current;
while (std::cin >> current) {
if (!inserted && new_name < current) {
std::cout << new_name << '\n';
inserted = true;
}
std::cout << current << '\n';
}
答案 3 :(得分:0)
我从这个人的测试中看到的向量(http://fallabs.com/blog/promenade.cgi?id=34)更快。我建议你测试一下,看看你自己。性能通常与平台有关,尤其是数据集。
从他的测试中,他得出结论,简单元素最适合矢量。对于复杂元素(例如,超过4个字符串),multiset更快。
此外,由于向量是大数组,如果要添加大量数据,可能值得研究使用其他类型的容器(例如链接列表或专用的boost容器,请参阅Is there a sorted_vector class, which supports insert() etc.?)。 / p>