C++ 交换c+中的列+;

C++ 交换c+中的列+;,c++,swap,C++,Swap,我的标准矩阵定义为: std::vector<std::vector<double> > Qe(6,std::vector<double>(6)); 我想交换矩阵Qe的第3列和第2列,如向量v所示 在Matlab中,这就像编写Qe=Qe(:,v)一样简单 我想知道在C++中除了Afor循环之外还有其他简单的方法吗?< /P> 提前谢谢 鉴于您已经将其实现为向量向量,您可以使用一个简单的交换: std::swap(Qe[2], Qe[3]); 这应该具有恒定

我的标准矩阵定义为:

std::vector<std::vector<double> > Qe(6,std::vector<double>(6));
我想交换矩阵Qe的第3列和第2列,如向量v所示

在Matlab中,这就像编写
Qe=Qe(:,v)一样简单

<>我想知道在C++中除了Afor循环之外还有其他简单的方法吗?< /P>
提前谢谢

鉴于您已经将其实现为向量向量,您可以使用一个简单的交换:

std::swap(Qe[2], Qe[3]);
这应该具有恒定的复杂性。当然,这取决于您是将数据视为列主数据还是行主数据。但是,如果要经常交换列,则需要对数据进行适当的安排(即允许上面的代码工作)

在使用行主排序(C++通常使用)时,如果不使用
for
循环,则可以通过使用标准算法(至少从源代码中)从技术上消除
for
循环:

std::for_each(Qe.begin(), Qe.end(), [](std::vector<double> &v) {std::swap(v[2], v[3]); });

…但我从来没有特别喜欢
std::for_each
,当C++11为
循环添加基于范围的
时,我认为这是一种优于绝大多数情况的选择,因为
std::for_each
以前可能是一种合理的可能性(依我看,我从未见过std::for_each有多大用处,现在几乎看不到任何用处)。

取决于如何实现矩阵

  • 如果有列向量,可以交换列引用。O(1)
  • 如果有行向量,则需要使用for循环交换每行中的元素。O(n)
std::vector
可以用作矩阵,但您还需要自己定义它是列向量还是行向量

您可以为此创建一个函数,这样就不会每次都编写for循环。例如,您可以编写一个函数,该函数接收一个矩阵,该矩阵是一个列向量和一个重新排序向量(如v),并基于该重新排序向量创建一个新矩阵

//untested code and inefficient, just an example:
vector<vector<double>> ReorderColumns(vector<vector<double>> A, vector<int> order)
{
    vector<vector<double>> B;
    for (int i=0; i<order.size(); i++)
    {
        B[i] = A[order[i]];
    }
    return B;
}
//未经测试的代码,效率低下,举个例子:
向量重新排序列(向量A,向量顺序)
{
载体B;

对于(int i=0;i,如果您处于行场景中。以下可能会起作用:

// To be tested
std::vector<std::vector<double> >::iterator it;
for (it = Qe.begin(); it != Qe.end(); ++it)
{
    std::swap((it->second)[2], (it->second)[3]);
}
//待测试
std::vector::it迭代器;
for(it=Qe.begin();it!=Qe.end();+it)
{
交换((it->second)[2],(it->second)[3]);
}

在这种情况下,我看不到任何其他解决方案可以避免循环O(n)。

Matlab专用于此类计算;C++的
向量
是低级原语。瞧,我什么都不知道。你的矩阵是行主还是列主?也就是说,
Qe[0]
第一行还是第一列?我希望是列,因为这样更容易;-)不,列本身并不存在。你所拥有的只是一个向量向量。你需要实现自己的列交换函数。我还将实现一个实矩阵类。嗨,@SteveJessop。恐怕它的行主要:(@ Cele:是的,你完全是自己的。因为我已经定义了我的矩阵行主要,这交换了我的第二和第三行。但是它还是有用的,谢谢。我想知道除了C++之外还有别的方法能在C++中这样做。
//untested code and inefficient, just an example:
vector<vector<double>> ReorderColumns(vector<vector<double>> A, vector<int> order)
{
    vector<vector<double>> B;
    for (int i=0; i<order.size(); i++)
    {
        B[i] = A[order[i]];
    }
    return B;
}
// To be tested
std::vector<std::vector<double> >::iterator it;
for (it = Qe.begin(); it != Qe.end(); ++it)
{
    std::swap((it->second)[2], (it->second)[3]);
}