向量中的编号元素

时间:2014-05-24 09:44:12

标签: c++ algorithm 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算法对向量中的元素进行编号?

3 个答案:

答案 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