我有一个整数向量。例如: 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算法对向量中的元素进行编号?
答案 0 :(得分:1)
在我看来,最简单的方法是使用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 ( std::vector<std::reference_wrapper<int>>::size_type i = 0;
i < vr.size();
i++ )
{
vr[vr.size() + i - 1].get() = i + 1;
}
答案 1 :(得分:0)
在这种情况下,当值大于或等于而不是大于时,你应该增加,试试这个: (* i> = * j)
答案 2 :(得分:0)
如果要用整数替换迭代器,即:(我假设在迭代器上没有定义<
,但它可能是)
for (int i = 0; i < vietos.size(); i++)
当左边的元素相等时,也可以增加n
vietos[i] > vietos[j] || (vietos[i] == vietos[j] && j < i)
。
或者,您可以创建一个vector<pair<int, int> >
,每对包含元素及其索引,然后sort
,并迭代排序的向量,在原始向量中设置对中的索引到排序向量中的索引。
这将给出O(n log n)运行时间,而不是上面的O(n²)。
的伪代码:
vector arr
vector<pair> pairs
for i = 0 to n
pairs.insert(arr[i], i)
sort pairs
for i = 0 to n
arr[pairs[i].second] = i