如何替换对应值的2D向量?

3

我试图替换一个二维向量 (vector<vector<int>>) 中的元素。我不仅想通过一个值来改变元素,而是通过一个列表,这意味着,例如,将 1,3,4,5,8,9 一一对应地更改为 1,2,3,4,5,6。我已经用双重循环编写了非常慢的代码。是否有任何方法可以加快处理速度,使用新函数或对元素进行排序?因为我的二维向量非常大,实际上是3*300000。下面是我的示例代码:

int myints[] = { 1,3,4,5,8,9 };
int myints2[] = { 1,2,3,4,5,6 };
std::vector<int> vals (myints, myints+6); 
std::vector<int> vals2 (myints2, myints2+6); 
vector<vector<int>> V0(3);
V0[0]={1,4,5};
V0[1]={3,1,8};
V0[2]={1,9,4};
for (size_t j = 0; j < V0.size(); j++)
{
    for (int i = 0; i < vals.size(); i++)
    replace(V0[j].begin(), V0[j].end(), vals[i], vals2[i]);
};

理想的输出V0应该是:

1 3 4
2 1 5
1 6 3

你的算法有点不清晰,主要是因为你给出的示例输出似乎有错误。例如,数字6从哪里来的?它既不在myints中也不在V0中。你能否请再次检查示例输出。 - Chris Pearce
另外需要注意的是,您可能正在尝试将元素写入未初始化足够空间的V0中。 - Chris Pearce
1
@ChrisPearce 对不起我忘记初始化V0的容量。我已经更改了示例代码,使其更清晰易懂。这只是一个'成对替换'。1变为1,3变为2,4变为3,5变为4,8变为5,而6则来自初始的9。 - Wei Zhang
1个回答

1

你可以使用unordered_map直接替换每个值,而不是在整个向量中搜索每个替换项:

#include <vector>
#include <unordered_map>
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
    unordered_map<int, int> replacements{{1, 1}, {3, 2}, {4, 3}, {5, 4}, {8, 5}, {9, 6}};
    vector<vector<int>> v0(3);
    v0[0] = {1, 4, 5};
    v0[1] = {3, 1, 8};
    v0[2] = {1, 9, 4};
    for_each(v0.begin(), v0.end(), [&](vector<int>& v)
    {
        transform(v.begin(), v.end(), v.begin(), [&](int val)
        {
            auto it = replacements.find(val);
            return it != replacements.end() ? replacements[val] : val;
        });
    });
    // Print
    for (auto& v : v0)
    {
        cout << "[ ";
        for (auto val : v)
        {
            cout << val << ", ";
        }
    cout << "]" << endl;
    }
    return 0;
}

输出:

[ 1, 3, 4, ]
[ 2, 1, 5, ]
[ 1, 6, 3, ]

在C++17中,你也可以选择并行的执行策略for_each和/或transform中,因为所有的变化都可以并行完成。

谢谢。另外,你上面的代码是并行运行还是串行运行? - Wei Zhang
@张伟 当未指定执行策略时,算法将按顺序运行(请参阅执行策略之间的区别及其使用时机)。 - jdehesa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接