【问题标题】:How to pass a second vector into the function that is the third argument of sort() function from C++ STL without using global variables?如何在不使用全局变量的情况下将第二个向量传递给 C++ STL 中 sort() 函数的第三个参数的函数?
【发布时间】:2023-03-15 13:53:01
【问题描述】:

我想将以下函数作为 C++ STL 中 sort() 函数中的第三个参数传递。

bool fn(int a, int b, vector<int> v1)
{
    if (v1[a]< v1[b]) return true;
    else return false;
}

我想根据另一个向量中的值对一个向量进行排序。

sort(v2.begin(), v2.end(),fn); 

如何将第一个向量v1 传递给函数fn,以便函数fn 可以在不使用全局变量的情况下对第二个向量v2 进行排序?

【问题讨论】:

  • 使用 lambda 并在那里传递第二个 vect
  • 使用捕获 lambda(或者可能是手写的函数对象)而不是常规函数。
  • 如果你不介意可以展示一下如何使用它吗?
  • 旁注:if(condition) return true; else return false;可以简化为return condition;
  • 我试图在main 中编写这个函数fn,希望它在作用域内,但没有奏效。

标签: c++ sorting stl c++17 c++14


【解决方案1】:

首先,您的比较器有错误的签名。 std::sort 需要一个可以用 2 个元素调用的可调用对象。

您可以使用捕获向量的 lambda 表达式:

sort(v2.begin(), v2.end(),[&v1](const auto& a,const auto& b){ return v1[a]< v1[b]; });

我尝试在main 中编写此函数fn,希望它在作用域内,但没有奏效。

您不能在函数中定义函数。您可以在函数内使用 operator() 定义类型,这基本上就是 lambda 表达式的作用。下面的手写函子也能达到同样的效果:

struct my_comparator {
    std::vector<int>& v1;
    bool operator(size_t a,size_t b) { 
           return v1[a] < v1[b];
    }
};
std::sort(v2.begin(),v2.end(),my_comparator{v2});

【讨论】:

  • 最好检查一下a &gt;= 0 &amp;&amp; a &lt; v1.size() &amp;&amp; b &gt;= 0 &amp;&amp; b &lt; v1.size()
  • @Raffallo 不,那会相当昂贵,因为每次比较都会检查它。如果需要检查,在使用向量进行排序之前应该只检查一次。
  • @Raffallo 请注意,std::sort 需要 O(N logN) 次比较,但最多需要进行 N 次检查(N 为 v2.size()
  • @Raffallo 允许符合要求的实现在std::vector::operator[] 中进行这些检查。 MSVC 在调试版本中会这样做
  • 好人! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
相关资源
最近更新 更多