与 C++ 交换函数混淆: std::vector<int>().swap(search_indices);

0 c++ swap stdvector

这是代码,我很困惑。swap函数通常用于交换两个参数的值,例如a.swap(b)swap(a, b)。这里有什么意义呢swap

std::vector<int> search_indices;
        std::vector<float> distances;

        int keypointNum = 0;
        do
        {
            keypointNum++;
            std::vector<int>().swap(search_indices);
            std::vector<float>().swap(distances);

            int id;
            iterUnseg = unVisitedPtId.begin();
            id = *iterUnseg;
            indices->indices.push_back(features[id].ptId);
            unVisitedPtId.erase(id);

            tree.radiusSearch(features[id].pt, _curvature_non_max_radius, search_indices, distances);

            for (int i = 0; i < search_indices.size(); ++i)
            {
                unVisitedPtId.erase(search_indices[i]);
            }

        } while (!unVisitedPtId.empty()); 
Run Code Online (Sandbox Code Playgroud)

我查了一下swap函数是如何工作的,没有相关的解释。

Eug*_*ene 5

根据给定的std::vector<int> v;定义,std::vector<int>().swap(v);清除向量v并处置其保留的内存(以便v.capacity()返回 0)。从 C++11 开始,可以说更好的编写方法是:

v.clear();
v.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

  • [“将capacity()减少为size()是一个**非约束性**请求。请求是否满足取决于实现。”](https://en.cppreference.com/w/cpp /容器/向量/shrink_to_fit)。“shrink_to_fit”可能不会改变向量容量。像 OP 代码中那样的交换保证最终会得到一个容量为空的空向量 (2认同)
  • @463035818_is_not_a_number 虽然使用 `shrink_to_fit` 并不能严格保证减少容量,但任何合理的实现都将在这种情况下按预期工作(大小为 0)。它不具有约束力的原因是为实现提供余地,将容量缩小到适合其分配方案的任何值(例如 2 的幂或用于摊销调整大小的任何值)。 (2认同)