Loading...

Във форума е въведено ограничение, което позволява на потребителите единствено да разглеждат публикуваните въпроси.

Filipbg avatar Filipbg 26 Точки

03. Make Company

Чудих се доста време. Доста се рових в нета за този case, но не намерих solution. Дава error no matching function for call to за този ред: 

employees.push_back(properties[i][0]), properties[i][1]); 

Ето го кода: 

#ifndef MAKECOMPANY_H
#define MAKECOMPANY_H

#include <memory>

#include "Company.h"

using namespace std;

shared_ptr<Company> makeCompany(vector<string>& properties)
{
  auto id = stoi(properties[0]);
  auto name = properties[1];
  vector<pair<char, char>> employees;
  for(int i = 2; i < properties.size(); ++i)
  {
      employees.push_back(properties[i][0]), properties[i][1]);
  }
  return make_shared<Company>(id, name, employees);
}

#endif // !MAKECOMPANY_H

Значи с emplace_back работи. Но с push_back не. Първоначално си мислих че е от компилатора ми. Но се оказва че и в Judge дава същия error. До колкото знам разлика в emplace_back и push_back почти няма. Само дето push_back е малко по бавен защото първо създава обекта, а после го вкарва във вектора, докато emplace_back директно го създава на место. Доста странна грешка. Някой има ли идея защо се получава това? Благодаря предварително! 

Тагове:
0
C++ Advanced
kolioi avatar kolioi 641 Точки
Best Answer

Елементите на вектора са двойка символи pair<char,char> и push_back() очаква да му подадеш такава двойка. Вместо това ти подаваш 2 параметъра и компилатора казва - няма такава функция push_back(), която да приема 2 аргумента. Трябва просто двата символа да ги направиш двойка с make_pair() и така да ги подадеш на push_back()

employees.push_back(make_pair(properties[i][0]), properties[i][1]));

 

0
Filipbg avatar Filipbg 26 Точки

Много благодаря за разяснението! Добро е и си прав, че са pair от chars. Но за жалост и този вариант не работи при мен, също и Judge е на същото мнение. Не ми се вярва да има чак такава разлика между emplace_back и push_back, че push_back да не може да извърши същата функция frown

Еrror-а който дава е: error: no matching function for call to 'make_pair(__gnu_cxx::__alloc_traits<std::allocator<char> >::value_type&)'|

Май съм се натъкнал на нещо като pitfall от страна на компилатора ми се струва laugh

0
kolioi avatar kolioi 641 Точки

Абе аз май съм объркал скобите на make_pair() :) Така е правилно

employees.push_back( make_pair( properties[i][0], properties[i][1] ) );

 

0
Filipbg avatar Filipbg 26 Точки

Пробвах функцията и сработи. Общо взето има разлика между двете. Не само в скоростта (в случая Time: 0.834 s, Time: 0.943 s), а и че push_back не може да му се подават два сурови аргумента без да са pairs, докато при emplace_back може. Определено не бях виждал такова нещо до сега laugh

Много благодаря за съдействието!

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.