c++ - vector 中的元素编号

标签 c++ algorithm vector

我有一个整数 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/

相关文章:

c++ - 在main中调用类的函数

c++ - 我如何根据它们的值获取 std::map 的前 n 个键?

python - 针对字符串中字符频率的优化计数器

javascript - 如何在 JavaScript 中缓存非顺序移位范围的数据?

c++ - 使用结构按值或引用传递

c++ - 在 C++ 行中读取不同的数据类型

algorithm - 曼哈顿寻路是否支持对角线移动?

c++ - 'std::vector' : 'U64' is not a valid template type argument for parameter '_Ty'

c++ - 二分查找的使用

C++:尝试理解通过引用传递 vector