【问题标题】:How to pass a vector to another vector push back? (without creating a extra variable to pass)如何将一个向量传递给另一个向量推回? (不创建额外的变量来传递)
【发布时间】:2013-01-25 09:52:20
【问题描述】:

我在问自己是否有办法直接在参数中传递向量,我的意思是,像这样:

int xPOS = 5, yPOS = 6, zPOS = 2;
//^this is actually a struct but 
//I simplified the code to this

std::vector <std::vector<int>>  NodePoints;
NodePoints.push_back(
    std::vector<int> {xPOS,yPOS,zPOS}
);

此代码当然会出错; typename 不允许,并且需要一个 ')'

我会使用结构,但我必须将数据传递到抽象虚拟机,我需要在其中以Array[index][index] 的形式访问节点位置,例如:

public GPS_WhenRouteIsCalculated(...)
{
    for(new i = 0; i < amount_of_nodes; ++i)
    {
        printf("Point(%d)=NodeID(%d), Position(X;Y;Z):{%f;%f;%f}",i,node_id_array[i],NodePosition[i][0],NodePosition[i][1],NodePosition[i][2]); 
    }
    return 1;
}

当然我可以这样做:

std::vector <std::vector<int>>  NodePoints;//global
std::vector<int> x;//local
x.push_back(xPOS);
x.push_back(yPOS);
x.push_back(zPOS);
NodePoints.push_back(x);

或者这个:

std::vector <std::vector<int>>  NodePoints;//global
std::vector<int> x;//global
x.push_back(xPOS);
x.push_back(yPOS);
x.push_back(zPOS);
NodePoints.push_back(x);
x.clear()

但是我想知道这两者中的哪一个会更快/更高效/更好? 或者有没有办法让我的初始代码工作(第一个 sn-p)?

【问题讨论】:

    标签: c++ stl vector multidimensional-array


    【解决方案1】:

    使用 C++11 或 boost 中的东西(也可以使用简单的v.push_back({1,2,3}),向量将从 initializer_list 构造)。

    http://liveworkspace.org/code/m4kRJ$0

    如果你没有 C++11,你也可以使用 boost::assign。

    #include <vector>
    #include <boost/assign/list_of.hpp>
    
    using namespace boost::assign;
    
    int main()
    {
       std::vector<std::vector<int>> v;
       v.push_back(list_of(1)(2)(3));
    }
    

    http://liveworkspace.org/code/m4kRJ$5

    当然你也可以使用旧变种

    int ptr[1,2,3];
    v.push_back(std::vector<int>(ptr, ptr + sizeof(ptr) / sizeof(*ptr));
    

    【讨论】:

    • visual studio 2012 讨厌我。 v.push_back({0,1,2});不会编译-.-'
    【解决方案2】:

    如果您无法访问 Boost 或 C++11,那么您可以考虑一个基于类的非常简单的解决方案。通过使用一些简单的访问控制包装一个向量以将您的三个点存储在一个类中,您可以创建所需的灵活性。首先创建类:

    class NodePoint
    {
    public:
        NodePoint( int a, int b, int c )
        {
            dim_.push_back( a );
            dim_.push_back( b );
            dim_.push_back( c );
        }
    
        int& operator[]( size_t i ){ return dim_[i]; }
    
    private:
        vector<int> dim_;
    };
    

    这里重要的是将向量封装为对象的聚合。 NodePoint 只能通过提供三个点来初始化。我还提供了operator[] 以允许对对象进行索引访问。可以这样使用:

    NodePoint a(5, 6, 2);
    cout << a[0] << " " << a[1] << " " << a[2] << endl;
    

    哪些打印:

    5 6 2
    

    请注意,如果尝试访问越界索引点,这当然会抛出,但这仍然比最有可能出现段错误的固定数组好。我不认为这是一个完美的解决方案,但它应该能让你相当安全地到达你想去的地方。

    【讨论】:

      【解决方案3】:

      如果您的主要目标是避免不必要的 vector&lt;&gt; 副本,那么您应该如何处理它。

      C++03

      在嵌套向量中插入一个空向量(例如Nodepoints),然后在其上使用std::swap()std::vector::swap()

      NodePoints.push_back(std::vector<int>());  // add an empty vector
      std::swap(x, NodePoints.back()); // swaps contents of `x` and last element of `NodePoints`
      

      所以swap() 之后,x 的内容会被转移到NodePoints.back() 而不进行任何复制。

      C++11

      使用std::move() 避免多余的副本

      NodePoints.push_back(std::move(x));  // #include<utility>
      

      这是std::moveexplanation,这是example

      上述两种解决方案的效果都有些相似。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2011-03-15
        • 2015-05-22
        相关资源
        最近更新 更多