0

さて、私は自分自身に、パラメータでベクトルを直接渡す方法があるかどうか疑問に思っています。つまり、次のようになります。

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}
);

もちろん、このコードはエラーになります。タイプ名は許可されておらず、「)」が必要です

構造体を使用したはずですが、次の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()

しかし、私は2つのうちどちらがより速い/より効率的/より良いのだろうかと思っていますか?または、最初のコードを機能させる方法はありますか(最初のスニペット)?

4

3 に答える 3

2

v.push_back({1,2,3})これには、C ++ 11またはboostの何かを使用します(単純なベクトルを使用することもできます。vectorは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));
于 2013-01-25T09:54:59.190 に答える
1

BoostまたはC++11にアクセスできない場合は、クラスに基づいた非常に単純なソリューションを検討できます。いくつかの単純なアクセス制御を使用してクラス内に3つのポイントを格納するためにベクトルをラップすることにより、必要な柔軟性を作成できます。最初にクラスを作成します。

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、3つのポイントを提供することによってのみ初期化できます。operator[]オブジェクトへのインデックス付きアクセスを許可するためにも提供しました。次のように使用できます。

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

どの印刷物:

5 6 2

もちろん、これは範囲外のインデックスポイントにアクセスしようとした場合にスローされますが、セグメンテーション違反の可能性が最も高い固定配列よりも優れていることに注意してください。私はこれを完璧な解決策とは考えていませんが、あなたが望む場所にかなり安全に行くことができるはずです。

于 2013-01-25T10:27:55.740 に答える
1

あなたの主な目標が不必要なコピーを避けることであるvector<>ならば、ここであなたはそれをどのように扱うべきか。

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::moveあり、ここにがあります。

上記の両方の解決策は、いくぶん似たような効果があります。

于 2013-01-25T10:48:42.223 に答える