Kirjoittaja Aihe: [ ratkaistu ] c++ auto vektorin alustuksessa  (Luettu 2335 kertaa)

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
[ ratkaistu ] c++ auto vektorin alustuksessa
« : 07.04.24 - klo:15.39 »
Netin ohjesivulla

https://www.tutorialspoint.com/cpp_standard_library/cpp_vector_range_constructor.htm

on hyvä esimerkkiohjelma, jonka voi kääntää suoraan sivulla. Tässä ohjelmassa vektorin v2 esittely ei toimi autona, vaikka näyttäisi, että kääntäjällä on tarpeeksi tietoa vektorin tyypin määrittelmiseksi. Yritin saada siistimmän näköistä ohjelmakoodia auton kanssa, mutta ei siis onnistu.

Mikä auton rajoite tässä kohtaa voisi olla kyseessä, miksi auto ei toimi. Kääntäjä antaa kyllä pitkät selitykset, mutta en oikein osaa niitä liiemmälti tulkita.

Tässä on alkuperäinen ohjelma, joka toimii

Koodia: [Valitse]
#include <iostream>
#include <vector>

using namespace std;

int main(void) {
   vector<int> v1(5);

   /* assigned value to vector v1 */
   for (int i = 0; i < v1.size(); ++i)
      v1[i] = i + 1;

   /* create a range constructor v2 from v1 */
   vector<int> v2(v1.begin(), v1.end());

   for (int i = 0; i < v2.size(); ++i)
      cout << v2[i] << endl;

   return 0;
}

ja tässä autoversio, joka ei toimi


Koodia: [Valitse]
#include <iostream>
#include <vector>

using namespace std;

int main(void) {
   vector<int> v1(5);

   /* assigned value to vector v1 */
   for (int i = 0; i < v1.size(); ++i)
      v1[i] = i + 1;

   /* create a range constructor v2 from v1 */
   auto v2(v1.begin(), v1.end());

   for (int i = 0; i < v2.size(); ++i)
      cout << v2[i] << endl;

   return 0;
}


« Viimeksi muokattu: 07.04.24 - klo:16.41 kirjoittanut teele »

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: c++ auto vektorin alustuksessa
« Vastaus #1 : 07.04.24 - klo:16.08 »
Eipä tuossa nyt oikein mitenkään auto voi toimia, kun ei tiedetä yhtään, minkä tyypin konstruktoria pitäisi kutsua. Ylipäätänsä ei voi tehdä näin:
Koodia: [Valitse]
auto muuttuja;
Näin voi tehdä:
Koodia: [Valitse]
auto muuttuja = luokka();
Lisäys: Kokeilin tuota koodia korvaamalla vector<int> tyypin autolla ja näköjään g++ päättelee tyypin olevan iteraattori, mikä ei tietenkään ole tässä toivottu lopputulos, eikä sillä ole sopivaa kontruktoria annetuille argumenteille.

Tämä tietenkin toimii:
Koodia: [Valitse]
auto v2 = vector<int>(v1.begin(), v1.end());
« Viimeksi muokattu: 07.04.24 - klo:16.17 kirjoittanut Tomin »
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Vs: c++ auto vektorin alustuksessa
« Vastaus #2 : 07.04.24 - klo:16.41 »

Oma ajatusvirhe selvästi. Kaksi vektori-iteraattoria tuntuivat niin ilmeisiltä vektorin alustusparametreila, että en ymmärtänyt, että melkein minkä tahansa itsekin määritellyn tyypin muodostimessa voisi olla kaksi vektori-iteraattoria. Se, että ne sopivat vektorin alustusparametreiksi, ei tietenkään tarkoita, että ne sopivat vain vektorin alustusparametreiksi.

Kiitoksia :)