我有一个整数 vector 。例如: 26 58 32 47 。我需要按顺序用它们的编号替换它们。在这种情况下,它将是: 4 1 3 2 。我试过这段代码:
int n = 1;
vector <int> vietos;
for (vector <int>::iterator i = vieta.begin(); i != vieta.end(); i++) {
for (vector <int>::iterator j = vieta.begin(); j != vieta.end(); j++) {
if (*i > *j)
n++;
}
vietos.push_back(n);
cout << n << " ";
n = 1;
}
有数字 23 25 38 28 26 28 (注意:在这种情况下,我以相反的顺序对它们进行编号!)我得到: 1 2 6 4 3 4 这是很好,除了两个数字相等。
也许有一些方法可以使用 STL 算法对 vector 中的元素进行编号?
最佳答案
在我看来,最简单的方法是使用 std::reference_wrapper
。代码会看起来简单明了。
这是演示该方法的程序。
尽情享受吧!:)
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
int main()
{
std::vector<int> v = { 23, 25, 38, 28, 26, 28 };
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
// Introducing a local block scope that the auxiliary vector would be automatically deleted
{
std::vector<std::reference_wrapper<int>> vr( v.begin(), v.end() );
std::stable_sort( vr.begin(), vr.end() );
for ( std::vector<std::reference_wrapper<int>>::size_type i = 0;
i < vr.size();
i++ )
{
vr[i].get() = i + 1;
}
}
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
输出是
23 25 38 28 26 28
1 2 6 4 3 5
如果你需要得到相反的顺序,你只需要添加到代码功能对象中
std::greater<std::reference_wrapper<int>>()
在 std::stable_sort
的调用中
例如
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
int main()
{
std::vector<int> v = { 23, 25, 38, 28, 26, 28 };
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
// Introducing a local block scope that the auxiliary vector would be automatically deleted
{
std::vector<std::reference_wrapper<int>> vr( v.begin(), v.end() );
std::stable_sort( vr.begin(), vr.end(),
std::greater<std::reference_wrapper<int>>() );
for ( std::vector<std::reference_wrapper<int>>::size_type i = 0;
i < vr.size();
i++ )
{
vr[i].get() = i + 1;
}
}
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
输出是
23 25 38 28 26 28
6 5 1 2 4 3
难道这不是最好的解决方案吗? :)
编辑:也许对函数对象使用 std::stable_sort
是没有意义的。以相反的顺序使用 for 循环设置数字就足够了。作为
for ( std::vector<std::reference_wrapper<int>>::size_type i = 0;
i < vr.size();
i++ )
{
vr[vr.size() + i - 1].get() = i + 1;
}
关于c++ - vector 中的元素编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23843540/