2015-05-19 2 views
0

Каков наилучший способ заполнить значениями этого типа?Как заполнить карту строки и пару векторов double

typedef std::map<std::string, std::pair<std::vector<double>, std::vector<double>>> buf; 

Итак, мне нужно что-то вроде этого:

(“Label”, {1,2,3}, {100,200,300}) 

Спасибо заранее!

UP: Итак, я пришел к этому. Но это выглядит не очень хорошо, я думаю:

double a[] = {0.1, 0.2}; 
double b[] = {0.0, 0.0}; 
foo.insert(make_pair("box", make_pair(vector<double>(a, a + sizeof(a)/sizeof(a[0])), vector<double>(b, b + sizeof(b)/sizeof(b[0]))))); 

ответ

1

, если это C++ 11 или более поздней версии

buf x = {{"Label", {{1,2,3}, {100, 200, 300}}};

EDIT

Без C++ 11, если вы действительно хотите, чтобы заполнить буквенные (как в вашем примере), создать вспомогательную функцию:

template <int N, int M> 
std::pair<std::vector<double>, std::vector<double>> build_pair(double(&x)[N], double(&y)[M]) 
{ 
    return std::make_pair(std::vector<double>(x, x + N), std::vector<double>(y, y + M)); 
} 

и вы можете использовать его:

double x[] = { 1, 2, 3 }; 
    double y[] = { 100, 200, 300 }; 
    b["Label"] = build_pair(x, y); 
+0

приятно, спасибо, но у вас нет C++ 11. –

+0

вы можете использовать boost lib? (См. Http: // www. boost.org/doc/libs/1_58_0/libs/assign/doc/index.html, он эмулирует некоторые возможности C++ 11) – Hcorg

+0

и без увеличения. Это очень больно для меня. –

2

Вы можете использовать insert

typedef std::map<std::string, std::pair<std::vector<double>, std::vector<double>>> buf; 

int main() 
{ 
    buf foo; 
    foo.insert({"Label", {{1,2,3}, {100,200,300}}}); 
} 

Обратите внимание, что вам нужно заключающий {} указать свой std::pair.

+0

я получил ошибку синтаксиса в VS 2010 на: отсутствует «)» перед «{» –

1

С большим и большим количеством скобок:

buf my_map {   // <== whole map 
    {    // <== next individual map item 
     "Label",  // <== key 
     {   // <== value 
      {1.0, 2.0, 3.0},  // <== value.first 
      {100.0, 200.0, 300.0} // <== value.second 
     } 
    } 
}; 

Который, когда вы кладете весь элемент на одной строке гласит:

buf my_map { 
    {"Label", {{1.0, 2.0, 3.0}, {100.0, 200.0, 300.0}}} 
}; 
+0

жаль, синтаксической ошибки VS2010 на этой конструкции. –

0
typedef std::map<std::string, std::pair<std::vector<double>, std::vector<double>>> buf; 

buf mybuf { 
    { 
     "Label", 
     { 
      {1,2,3}, {100,200,300} 
     } 
    }, 

    { 
     "Label2", 
     { 
      {4,5,6}, {400,500,600} 
     } 
    } 
}; 
+0

VS2010 ошибка синтаксиса throw на этом. –

+0

Я не удивлен. Возьмите настоящего киддо компилятора. –

+0

У меня есть ограничения на это. конечно, я бы предпочел сделать это умным способом –

1

На всякий случай вы имели в виду, что векторы уже существуют, и вы не инициализируете карту во время построения с буквальными значениями, тогда вы обычно используете std::make_pair для создания пары векторов, а также ключ/значение пара идущая int o карта.

#include <utility> 

buf my_map; 
my_map.insert(std::make_pair(label, std::make_pair(vector1, vector2))); 
+0

нет, нет векторов в начале. все с нуля. –

0

Для упрощения создания (с константами времени компиляции), заполненную карту я создал шаблоны, как это:

#include <map> 
#include <type_traits> 
template<typename... Ts> 
constexpr auto make_map(Ts&&... ts) 
    -> std::map<typename std::common_type_t<Ts...>::first_type,typename std::common_type_t<Ts...>::second_type> 
{ 
    return { std::forward<Ts>(ts)... }; 
}//--------------------------------------------------------- 

Он может быть использован, как это:

using namespace std; 
auto myDict = make_map(make_pair(666,string("the number of the beast")) 
         ,make_pair(667,string("the neighbor of the beast")) 
        ); 

создание myDict как "map < int, string>".

Или в вашем случае использовать его как это:

using namespace std; 
auto myDict = make_map(make_pair(string("label") 
           , make_pair(make_vector(1.,2.,3.) 
              ,make_vector(100.,200.,300.) 
              ) 
           ) 
        ); 

("make_vector" может быть определен очень похож на "make_map")

Информация о производителе _...подход (или, по крайней мере, «кажется мне кажется»), поскольку он опускает явное объявление типа шаблона, беря тип (ы) из параметров.

Может быть, это как-то полезным для других тоже (или по крайней мере вдохновляющей: -)) ...

Смежные вопросы