我有一个大 vector std::pair<std::string,size_t>
元素,我想使用小的额外内存开销将它解包为两个 vector (我不希望内存空间占用加倍,即在解包后删除对 vector )并且可能尽可能快。以下解决方案速度慢得令人无法接受:
std::vector<std::pair<std::string, size_t>> string_weight;
get_from_file("mybigfile.txt", string_weight); //it just fills the string_weight vector
//... do stuff...
std::vector<std::string> strings;
std::vector<size_t> weights;
for (auto it = string_weight.begin(); it != string_weight.end() ; it = string_weight.erase(it)) {
strings.push_back(std::move(it->first));
weights.push_back(std::move(it->second));
}
因此我尝试修改之前的解决方案,只是通过以下方式更改 for 循环:
for (auto it = string_weight.begin(), it2 = it; it != string_weight.end() ; it = string_weight.erase(it, it2)) {
size_t delta = 100000;
for ( it2 = it ; it2 != string_weight.end() && it2 != it+delta; it2++ ) {
strings.push_back(std::move(it2->first));
weights.push_back(std::move(it2->second));
}
}
这样更快,但完成时间与我为 delta
选择的值成正比我不喜欢它。你能帮我给出解决方案或指出一些有用的技巧吗?
提前谢谢你。
最佳答案
试试这个:
std::vector<std::string> strings;
std::vector<std::size_t> weights;
strings.reserve(string_weight.size());
weights.reserve(string_weight.size());
for (auto & p : string_weights)
{
strings.push_back(std::move(p.first));
weights.push_back(p.second);
}
一些变化:
预构建权重 vector :
std::vector<std::size_t> weights(string_weight.size()); // ... weights[i] = string_weights[i].second;
这可能会更好,因为它避免了重复的大小检查,但会让您付出初始清零的代价。 (这可以通过原始动态数组或非构造分配器来避免。)
预构造字符串 vector :
std::vector<std::string> strings(string_weight.size()); // ... strings[i] = std::move(string_weights[i].first); // or strings[i].swap(string_weights[i].first);
同样,这避免了重复范围检查。
关于c++ - 在两个 vector 中对 vector 进行空间高效解包的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39622833/