Kirjoittaja Aihe: C++ std::copy parametriarvot  (Luettu 1971 kertaa)

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
C++ std::copy parametriarvot
« : 26.04.19 - klo:14.40 »
Nyt on tullut pientä pohdittavaa loppuparametrin kertomisessa std::copy -funktiolle.

Alkuperäinen koodi toimii hyvin

Koodia: [Valitse]
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>

int main()       // tämä toimii alkuperäinen versio, versio 1
{
   std::string text = "Quick brown fox.";
   std::regex ws_re("\\s+"); // whitespace
   std::copy( std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
                            std::sregex_token_iterator(),
                            std::ostream_iterator<std::string>(std::cout, "\n")
                          );
}

jos alkuiteraattori annetaan kutsun ulkopuolella alustetulla muuttujalla, silloinkin ohjelma toimii hyvin.

Koodia: [Valitse]
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>

int main()       // tämä toimii, versio 2
{
   std::string text = "Quick brown fox.";
   std::regex ws_re("\\s+"); // whitespace
   std::sregex_token_iterator it1(text.begin(), text.end(), ws_re, -1);
   std::copy( it1,
                            std::sregex_token_iterator(),
                            std::ostream_iterator<std::string>(std::cout, "\n")
                          );
}

Mutta jos loppukohta annetaan funktion ulkopuolella alustetulla parametrilla, tulee käännöksessä virheitä.

Koodia: [Valitse]
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <regex>

nt main()       // tämä ei toimi, versio 3
{
   std::string text = "Quick brown fox.";
   std::regex ws_re("\\s+"); // whitespace
   std::sregex_token_iterator it1(text.begin(), text.end(), ws_re, -1);
   std::sregex_token_iterator stop();
   std::copy( it1,
                            stop,
                            std::ostream_iterator<std::string>(std::cout, "\n")
                          );
}

Vaikka versioita 1 ja 2 voi käyttää, joskus olisi siistimmän näköistä, jos voisi käyttäa myös 3-versiota, mutta miten sen voisi saada toimimaan. Miten loppukohdan voisi kertoa funktion ulkopuolisella muuttujalla.

Käännöskomento oli kaikissa

Koodia: [Valitse]
g++ regex07.cpp -o regex07 -std=c++17 -Wall -pedantic

kun lähdekoodi on regex07.cpp (eli kaikenlaista on yritetty, ainakin 7:s yritys menossa)


« Viimeksi muokattu: 26.04.19 - klo:16.17 kirjoittanut teele »