#include <algorithm> - nödvändigt? [LÖST]

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

#include <algorithm> - nödvändigt? [LÖST]

Inlägg av Johnny Rosenberg »

När jag fipplade med ett programexempel ur en bok, där man resonerade lite kring mallar och exemplifierade med en typoberoende swap-funktion, fick jag problem med att kompilatorn snackade om tvetydighet. När jag bytte namn på min funktionsmall till jswap, så fungerade det hela emellertid helt smärtfritt. Det verkade alltså som att funktionen krockade med något.

För att ta reda på detta så skrev jag följande lilla korta snutt:

Kod: Markera allt

#include <iostream>

int main(){
  using namespace std;
  int i=5, j=10;
  cout << "i=" << i << endl << "j=" << j << endl;
  swap(i,j);
  cout << "i=" << i << endl << "j=" << j << endl;

  return 0;
}
Jag läste mig till att det skulle finnas en swap-funktion i <algorithm> i standardbiblioteket, men som man kan se här, så har jag inte inkluderat denna! Ändå fungerar det hela. Variablerna byter värde med varandra utan problem och kompilatorn (g++ 4.2) verkar väldigt nöjd och belåten.
Har man av någon outgrundlig anledning lagt en swap-funktion i iostream? Det låter ju lite knasigt…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

Re: #include <algorithm> - nödvändigt?

Inlägg av gasol »

Testa att kompilera utan att använda using namespace std; då det är mkt möjligt att det finns en swap funktion definierad i std biblioteket som g++ länkar mot. (från algorithm)

Du fick inga varningar av kompilatorn när du kompilerade koden utan att inkludera några andra h-filer då?
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
cupe
Inlägg: 650
Blev medlem: 05 jun 2008, 07:10
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: #include <algorithm> - nödvändigt?

Inlägg av cupe »

Kod: Markera allt

#include <iostream>

int main()
{
  int i=5, j=10;
  std::cout << "i= " << i << std::endl << "j= " << j << std::endl;
  std::swap(i,j);
  std::cout << "i= " << i << std::endl << "j= " << j << std::endl;

  std::cin.get();
  std::cin.ignore();

   return 0;
}
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: #include <algorithm> - nödvändigt?

Inlägg av Johnny Rosenberg »

gasol skrev:Testa att kompilera utan att använda using namespace std; då det är mkt möjligt att det finns en swap funktion definierad i std biblioteket som g++ länkar mot. (från algorithm)

Du fick inga varningar av kompilatorn när du kompilerade koden utan att inkludera några andra h-filer då?
Koden såg ut exakt som jag återgav den och jag fick ingen som helst varning. Jag trodde jag MÅSTE ha med raden

Kod: Markera allt

#include <algorithm>
för att jag ska kunna använda swap(), men det enda jag inkluderade var ju iostream, absolut inget annat. Behöver man inte uttryckligen inkludera saker som ingår i std, alltså?

I alla fall, utan

Kod: Markera allt

using namespace std;
fick jag ju felmeddelandet att swap() inte var deklarerad. När jag lade till std:: framför swap gick kompileringen igenom igen.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
cupe
Inlägg: 650
Blev medlem: 05 jun 2008, 07:10
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: #include <algorithm> - nödvändigt?

Inlägg av cupe »

Johnny Rosenberg skrev:
gasol skrev:Testa att kompilera utan att använda using namespace std; då det är mkt möjligt att det finns en swap funktion definierad i std biblioteket som g++ länkar mot. (från algorithm)

Du fick inga varningar av kompilatorn när du kompilerade koden utan att inkludera några andra h-filer då?
Koden såg ut exakt som jag återgav den och jag fick ingen som helst varning. Jag trodde jag MÅSTE ha med raden

Kod: Markera allt

#include <algorithm>
för att jag ska kunna använda swap(), men det enda jag inkluderade var ju iostream, absolut inget annat. Behöver man inte uttryckligen inkludera saker som ingår i std, alltså?

I alla fall, utan

Kod: Markera allt

using namespace std;
fick jag ju felmeddelandet att swap() inte var deklarerad. När jag lade till std:: framför swap gick kompileringen igenom igen.
Du inkluderade inte bara <iostream>, du inkluderade ju hela namespace std, vilket både är onödigt och inte anses som "god standard". Med std::swap deklarerar du att du vill använda funktionen swap ifrån namespace std. Med min kod ovan fungerar det prima.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: #include <algorithm> - nödvändigt?

Inlägg av Johnny Rosenberg »

cupe skrev:Du inkluderade inte bara <iostream>, du inkluderade ju hela namespace std, vilket både är onödigt och inte anses som "god standard". Med std::swap deklarerar du att du vill använda funktionen swap ifrån namespace std. Med min kod ovan fungerar det prima.
Så du menar att jag även hade kunnat utelämna #include <iostream>, för den ingår ävl också i std?

För mig är det en total gåta varför inkludering av std:: på flera ställen per rad kan anses vara en bättre standard än att här och var göra klart för vilket namnutrymme man ämnar hålla sig till. Vill man inte eftersträva läslig kod? Det är ju nästan som att jag skulle skriva denna text på rövarspråket för att med bokstaven ”o” markera att ”här var just en konsonant och här kommer den igen”…

Jag har ju hittills trott att using namespace std; innebär att man använder namnutrymmet i std, men bara för det man inkluderat. Det vore ju det självklara om jag hade fått bestämma i alla fall.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
cupe
Inlägg: 650
Blev medlem: 05 jun 2008, 07:10
OS: Ubuntu
Utgåva: 12.04 Precise Pangolin LTS

Re: #include <algorithm> - nödvändigt?

Inlägg av cupe »

Johnny Rosenberg skrev:
cupe skrev:Du inkluderade inte bara <iostream>, du inkluderade ju hela namespace std, vilket både är onödigt och inte anses som "god standard". Med std::swap deklarerar du att du vill använda funktionen swap ifrån namespace std. Med min kod ovan fungerar det prima.
Så du menar att jag även hade kunnat utelämna #include <iostream>, för den ingår ävl också i std?

För mig är det en total gåta varför inkludering av std:: på flera ställen per rad kan anses vara en bättre standard än att här och var göra klart för vilket namnutrymme man ämnar hålla sig till. Vill man inte eftersträva läslig kod? Det är ju nästan som att jag skulle skriva denna text på rövarspråket för att med bokstaven ”o” markera att ”här var just en konsonant och här kommer den igen”…

Jag har ju hittills trott att using namespace std; innebär att man använder namnutrymmet i std, men bara för det man inkluderat. Det vore ju det självklara om jag hade fått bestämma i alla fall.
Som du precis har märkt i exemplet ovan är det ingen god idé att inkludera hela namespace eftersom det finns risk för att det krockar, vad är det som är så oläsligt med koden ovan?

Så du menar att jag även hade kunnat utelämna #include <iostream>, för den ingår ävl också i std?

Du måste sära på bibliotek och namespace's.
Användarvisningsbild
DrMegahertz
Inlägg: 296
Blev medlem: 06 maj 2006, 14:37
OS: Ubuntu
Utgåva: 14.04 Trusty Tahr LTS
Ort: Södra Dalarna

Re: #include <algorithm> - nödvändigt?

Inlägg av DrMegahertz »

Det är väl mycket möjligt att 'iostream' nyttjar något ur 'algorithm', och således också inkluderar den.
Dock så öppnar inte 'iostream' upp någon namnrymd genom att använda nyckelordet 'using', men när du använder 'using namespace std;' så öppnar du ju upp hela namnrymden, och DÅ kolliderar din swap-funktion med std::swap i 'algorithm'! :)

Jag spinner vidare på din kod för att visa vad jag menar!

Kod: Markera allt

#include <iostream>

// Utan att öppna upp hela namnrymden så anger vi att vi vill använda cout
// och endl ur namnrymden 'std'. På så sätt kan vi undvika namnkollision med
// std::swap!
using std::cout;
using std::endl;

template<typename T>
void swap(T& a, T& b)
{
    T tmp;

    cout << "Vår swap!\n";

    tmp = a;
    a = b;
    b = tmp;
}

int main()
{
  int i=5, j=10;

  cout << "=== Här använder vi vår swap() ===\n";
  cout << "i=" << i << endl << "j=" << j << endl;
  swap(i,j);
  cout << "i=" << i << endl << "j=" << j << endl << endl;

  cout << "=== Nu använder vi std::swap() ===\n";
  cout << "i=" << i << endl << "j=" << j << endl;
  std::swap(i,j);
  cout << "i=" << i << endl << "j=" << j << endl;

  return 0;
}
Dock så är det enligt mig, "god standard"(:p), att inkludera algorithm om man använder sig av std::swap, just för att markera användningen av biblioteket!

Hoppas det får allt att klarna! :)
BildAre you shpongled? Bild
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Re: #include <algorithm> - nödvändigt? [LÖST]

Inlägg av Johnny Rosenberg »

Tack så mycket, tror jag börjar fatta. Känner mig snart riktigt bildad… :P
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"