c++ - 在两个 vector 中对 vector 进行空间高效解包的优雅方法

标签 c++ performance c++11 memory vector

我有一个大 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/

相关文章:

c++ - 双重构造是未定义的行为吗?

c++ - 在 Crypto++ 中使用 RSA 加密对称 AES key

c++ - 如何避免这种重复

c++ - 可连接的 std::thread 不自动连接的原因是什么?

用于进行 Jax WS 调用的 C++ 库

c++ - 如何在 linux 中使用 Makefile 编译 tensorflow c_api

iphone - 用Cocos2D制作动画有什么好方法吗?

C++:在表达式和函数调用上使用 '.' 运算符

java - for 循环与 if-else 语句中的代码

c++ - 需要 Meyers Effective C++ Widget 右值实例讲解