0

私は を持っておりmap<T,vector<double> >T=char値は言うvector<double>length<n言うn=5. それぞれを map からlength を持つvector<double>bigに転送したいと思います。各ベクトルは index に挿入されます。可能であれば、これらすべてをコピーせずに。vector<double>n*mapsize5*k

#include <vector>
#include <map>
using namespace std;
int main()
{
    typedef vector<double> Vec;
    typedef map<char, vector<double> >::iterator ItMap;

    //create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
    double v_value[] = {1.1,2.4};
    Vec v(v_value, v_value + sizeof(v_value)/sizeof(double));
    map<char,vector<double> > myMap;
    myMap['A'] = v;
    v.push_back(10);
    myMap['B'] = v;

    //create the vector that should get all the small vectors
    Vec receipt;
    receipt.reserve(10);

    for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
        it->second.resize(5);
        receipt.insert(receipt.end(),it->second.begin(),it->second.end());
    }
}

編集:私は自分のソリューションで編集しましたが、コピーします。

4

2 に答える 2

5

コメントで説明したように、コピーしないと不可能です。マップ内の各ベクトルは個別に管理される動的配列であり、新しいベクトルは新しい大きな配列です。値をコピーする必要があります。あなたがプロファイリングして重大な問題であることがわかっていない限り、私はこれについて心配しません.

その精神でstd::copy、救出へ…でででででででででででで…

#include <vector>
#include <map>
#include <algorithm>

template<typename T, size_t N>
size_t length(T (&)[N]) {
   return N;
}

int main()
{
    typedef std::vector<double> Vec;
    typedef std::map<char, vector<double> >::iterator ItMap;

    //create a map<char,vector<double>> with 2 keys holding resp 2-3 elem vectors
    double v_value[] = {1.1,2.4};
    Vec v(v_value, v_value + length(v_value));
    std::map<char,vector<double> > myMap;
    myMap['A'] = v;
    v.push_back(10);
    myMap['B'] = v;

    //create the vector that should get all the small vectors
    Vec receipt(10);

    for(ItMap it = myMap.begin(); it != myMap.end(); ++it) {
        std::copy(it->second.begin(), it->second.end(), std::back_inserter(receipt));
    }
}

ユーザー定義型や より複雑な型の場合、ターゲット コンパイラが C++11 をサポートしてdoubleいる場合は、より効率的に使用できます。std::move

私は配列の長さを計算するための小さなトリックをデモしました...私はいつも混乱しsizeofます.

PS私は嫌い using namespace stdです。

于 2013-03-01T17:07:16.867 に答える
1

ベクトルに安価で移動可能でコピーに費用がかかるものが含まれている場合は、std :: move:を使用して、各小さなベクトルの内容を大きなベクトルに移動できます。

std::vector<T2> big_vector;
std::map<T1, std::vector<T2>> m = ....;

#include <algorithm> // for this std::move overload
#include <iterator>  // for std::back_inserter

for(auto& e : m) {
  std::move(m.second.begin(), m.second.end(), std::back_inserter(big_vector));
}

一方、保存doublesしているので、コピー以外にできることはあまりありません。上記は機能しますがmove、ダブルの場合はコピーです。したがって、最後のループは次のように置き換えることができます

for(const auto& e : m) {
  std::copy(m.second.begin(), m.second.end(), std::back_inserter(big_vector));
}
于 2013-03-01T17:04:34.730 に答える