3 Pregunta: std :: vector <std :: vector <T>> :: end () rend () begin () etc. ¿no tiene miembros?

pregunta creada en Sun, Mar 17, 2019 12:00 AM

Escribo esto

std::vector<std::vector<int>> v;
v.rbegin()->push_back({});

Y el IDE dice que no hay push_back. Además de eso, no hay miembros en absoluto, y no tenemos idea de por qué.

Incluye :

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
#include <iterator>
  

No hay sugerencias para los miembros de std :: reverse_iterator

P.S. Usa Clion 2018.3 y Bazel

UPD: Intenté construir el proyecto utilizando CMake. ¡Funciona! Pero, ¿qué puede estar mal con Bazel?

CONSTRUIR:

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = ["open_text.txt"],
)

WORKSPACE está vacío.

    
- 4
  1. Proporcione un ejemplo reproducible mínimo , como texto, al tiempo que incluye mensajes de error copiados y pegados, como texto.
    2019-03-17 22: 59: 36Z
  2. Además, ya que realmente quieres saber por qué CLion no puede sugerir a los miembros de 060035099111110101035062, esa información probablemente debería ser parte de tu pregunta.
    2019-03-17 23: 01: 43Z
  3. Lo siento. Ahora, es mejor
    2019-03-17 23: 08: 13Z
  4. ¡De hecho, es una buena solución!
    2019-03-17 23: 11: 41Z
  5. No hay ningún tipo std::reverse_iterator, por lo que std::reverse_iterator no tiene miembros. Es una plantilla y necesita ser instanciada. Parece una limitación de Clion: ¿has intentado preguntar en su lista de correo?
    2019-03-17 23: 12: 45Z
3 Respuestas                              3                         

Suspiro. Tienes un par de problemas, y no es del todo obvio lo que te interesa.

  1. CLion no muestra los métodos std::reverse_iterator.

    No tengo idea, ¿realmente dependes de esto? Hay documentación , ya sabes.

  2. Ni los iteradores std::reverse_iterator<...> ni los end() se pueden desreferir de todos modos, por lo que en realidad no apuntan a nada . Entonces, incluso si el tipo que tiene su iterador tiene este método, sería ilegal llamar porque no hay ningún objeto allí.

Puedes añadir un elemento a la última entrada en tu vector externo como

rend()

si eso es lo que quieres. Pero, como un recordatorio final, los métodos

v.back().push_back({});
y end() devuelven iteradores pasados ​​de largo que no pueden ser referenciados. No hagas eso.     
2
2019-03-17 23: 24: 36Z
  1. Oh, sí, no tengo idea sobre el problema de CLion. Pero el código está roto en un par de formas distintas además de eso.
    2019-03-17 23: 16: 50Z
  2. re # 2, el iterador está siendo referenciado, produciendo un vector, que seguramente tiene una función de miembro rend()
    2019-03-17 23: 23: 25Z
  3. No estoy seguro de que la desreferenciación push_back cuente como un vector realmente. Produce una referencia ilegal de ese tipo, supongo.
    2019-03-17 23: 24: 08Z
  4. Tienes razón, pero mira: hay un miembro rbegin () y no hay opciones también
    2019-03-17 23: 27: 14Z
  5. En términos del tipo de expresión. Todos conocemos la OP no debería ser una desreferenciación rend(); eso no tiene ningún efecto en el tipo de devolución del operador de referencia diferente de la especialización rend(), y no explica el problema que se pregunta. Honestamente, una vez más, OP debería preguntar a los desarrolladores de Clion.
    2019-03-17 23: 27: 35Z

Entonces, estás usando el IDE de CLion y el sistema de compilación Bazel, y no estás obteniendo la terminación automática en tu código C ++. La finalización automática funciona cuando se cambia al sistema de compilación CMake.

Para la documentación de Bazel , su integración de CLion para el autocompletado es en beta . Al hacer clic en sus documentos de IntelliJ (a través de un enlace en la sección CLion) solo Java y Python son listados como idiomas compatibles .

Por lo tanto, esto simplemente no es compatible todavía.

Puede pedirle al equipo de desarrollo de ese proyecto una confirmación y obtener información sobre cuándo se ofrecerá el soporte de C ++ en Bazel for CLion.

Por cierto, tiene un error en su código: std::reverse_iterator no se hará referencia cuando el vector esté vacío. Aunque espero que ese fragmento fuera solo una exposición.

    
2
2019-03-17 23: 51: 55Z
  

Devolver el iterador inverso para invertir el fin Devuelve un iterador inverso   apuntando al elemento teórico que precede al primer elemento en el   vector (que se considera su extremo inverso).

     

El rango entre vector :: rbegin y vector :: rend contiene todos los   Elementos del vector (en orden inverso).

elemento teórico que precede al primero - > No debe ser desreferenciado. No apunta a un elemento.

Mi conjetura es que quieres hacer: rbegin()

Eso, dado que v.back()->push_back({}); no está vacío. Debes hacer v si está vacío como ejemplo, primero.


En cuanto al IDE, debería ser un problema de configuración. Principalmente trabajo en Eclipse, allí este problema se resuelve generalmente:

  • Establecer la configuración del compilador para que coincida con la de cmake (como ejemplo, los proyectos de C ++ por defecto no vienen con c ++ 11 habilitado, por lo que debe asegurarse de que tenga un -std = c ++ 11 en la configuración del compilador del IDE).

  • Volver a explorar para todos los incluidos.

Por lo general, puede intentar ver si algo no se reconoce (como ejemplo, subrayar en la palabra clave del vector). Y cuando presionas ctrl + clic en vector, puedes ver qué encabezado está usando el IDE y qué código está usando (puede haber algunos ifdefs y otros no activados, como ejemplo __cppversion > = 201103L o algo así significa que IDE cree que no tiene un compilador de C ++ 11 en uso).

    
0
2019-03-17 23: 29: 58Z
  1. Verdadero, pero irrelevante.
    2019-03-17 23: 11: 39Z
  2. @ LightnessRacesinOrbit ¿Qué tiene de irrelevante? Está preguntando por qué los miembros del IDE no pueden haber mostrado algo que claramente no debería desreferir.
    2019-03-17 23: 13: 02Z
  3. Pero hay 'rend ()' en el ejemplo
    2019-03-17 23: 13: 18Z
  4. @ Mirko Está hablando de un problema lógico con el programa, que no tiene nada que ver con la capacidad del IDE (o la falta del mismo) para realizar actividades "intellisense" en Expresiones y declaraciones de código fuente.
    2019-03-17 23: 13: 53Z
  5. Tienes razón, rend () no tiene nada que ver aquí. Lo he cambiado. Pero, desafortunadamente, no ha resuelto el problema. Y funciona si usas CMake
    2019-03-17 23: 22: 04Z
v.push_back({})
fuente colocada aquí