了解向量初始化的问题

时间:2019-05-31 10:01:58

标签: c++ vector

这可能是一个愚蠢的问题,但是有些事情我不太了解。使用向量时,只要我想将某个元素“推回”到某个位置,就必须以某种方式初始化向量。

例如,当我使用此初始化时:

2019-05-31 14:35:54.116  INFO 26667 --- [  restartedMain] c.e.configuration.SpringConfiguration    : Starting SpringConfiguration on Daniyal with PID 26667 (/home/daniyal/IdeaProjects/Example/target/classes started by daniyal in /home/daniyal/IdeaProjects/Example)
2019-05-31 14:35:54.119  INFO 26667 --- [  restartedMain] c.e.configuration.SpringConfiguration    : No active profile set, falling back to default profiles: default
2019-05-31 14:35:54.164  INFO 26667 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2019-05-31 14:35:54.165  INFO 26667 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2019-05-31 14:35:54.848  INFO 26667 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-05-31 14:35:54.869  INFO 26667 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 14ms. Found 0 repository interfaces.
2019-05-31 14:35:55.259  INFO 26667 --- [  restartedMain] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$4830e052] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-05-31 14:35:55.598  INFO 26667 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-05-31 14:35:55.631  INFO 26667 --- [  restartedMain] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-05-31 14:35:55.631  INFO 26667 --- [  restartedMain] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.19]
2019-05-31 14:35:55.715  INFO 26667 --- [  restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-05-31 14:35:55.715  INFO 26667 --- [  restartedMain] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1550 ms
2019-05-31 14:35:55.868  INFO 26667 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2019-05-31 14:35:56.075  INFO 26667 --- [  restartedMain] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Driver does not support get/set network timeout for connections. (com.mysql.jdbc.JDBC4Connection.getNetworkTimeout()I)
2019-05-31 14:35:56.077  INFO 26667 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2019-05-31 14:35:56.117  INFO 26667 --- [  restartedMain] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2019-05-31 14:35:56.163  INFO 26667 --- [  restartedMain] org.hibernate.Version                    : HHH000412: Hibernate Core {5.2.12.Final}
2019-05-31 14:35:56.164  INFO 26667 --- [  restartedMain] org.hibernate.cfg.Environment            : HHH000205: Loaded properties from resource hibernate.properties: {jdbc.url=jdbc:mysql://localhost/3306/test, hibernate.dialect=org.hibernate.dialect.H2Dialect, hibernate.show_sql=true, jdbc.user=root, hibernate.bytecode.use_reflection_optimizer=false, hibernate.hbm2ddl.auto=create-drop, jdbc.driverClassName=org.h2.Driver, jdbc.pass=dani861}
2019-05-31 14:35:56.192  INFO 26667 --- [  restartedMain] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2019-05-31 14:35:56.282  INFO 26667 --- [  restartedMain] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2019-05-31 14:35:56.306  INFO 26667 --- [  restartedMain] o.h.e.j.e.i.LobCreatorBuilderImpl        : HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
2019-05-31 14:35:56.454  INFO 26667 --- [  restartedMain] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@cf13b9f'
2019-05-31 14:35:56.456  INFO 26667 --- [  restartedMain] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2019-05-31 14:35:56.473  INFO 26667 --- [  restartedMain] o.s.b.d.a.OptionalLiveReloadServer       : LiveReload server is running on port 35729
2019-05-31 14:35:56.680  INFO 26667 --- [  restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-05-31 14:35:56.717  WARN 26667 --- [  restartedMain] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2019-05-31 14:35:56.957  INFO 26667 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-05-31 14:35:56.960  INFO 26667 --- [  restartedMain] c.e.configuration.SpringConfiguration    : Started SpringConfiguration in 3.121 seconds (JVM running for 3.414)

我收到以下错误: 对'Myvec.std :: vector <_Tp,_Alloc> :: operator []>((((std :: vector :: size_type)i))'的成员'push_back'的请求,该请求是非类类型'__gnu_cxx :: __ alloc_traits> :: value_type {aka int}'|

但是当我使用以下初始化时,它会起作用:

std::vector<int> Myvec;
int size = 0;
int x = 0;
std::cin >> size;

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec[i].push_back(x);
}

我使用它没有任何问题,可以在各种任务中实现它,但是它困扰着我,因为我不确定它为什么真正起作用。谢谢您的提前帮助。

3 个答案:

答案 0 :(得分:1)

在第一块中,您应该使用:

std::vector<int> Myvec;
int size = 0;
int x = 0;
std::cin >> size;

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec.push_back(x);
}

或者您可以使用:

int size = 0;
int x = 0;
std::cin >> size;
std::vector<int> Myvec(size);
for(int i = 0; i < size; i++)
{
    cin>>Myvec[i];
}

并使用以下命令打印矢量:

for(int i = 0; i < size; i++) {
     std::cout<< Myvec[i]<<" ";
}

使用向量Myvec [size]对其进行初始化时,它将变为大小为“ size”的向量的向量,这意味着每个Myvec [i]都是可以在其中推送元素的向量。

在此处了解更多信息:https://www.geeksforgeeks.org/2d-vector-in-cpp-with-user-defined-size/

答案 1 :(得分:0)

您对std::vector::push_back函数的工作方式有误解。它基本上在向量的末尾附加了一个新对象。特别是,您不需要使用std::vector::operator[]索引到向量中。而是将代码段更改为

for(int i = 0; i < size; i++)
{
    std::cin >> x;
    Myvec.push_back(x);
}

您想到的解决方案可能会执行您不希望做的事情,即使用原始向量数组:将用户输入传递到对象中时,它会创建size个向量,每个向量都有一个元素。 / p>

答案 2 :(得分:0)

您不是要在向量中将元素放置在i位置。

您要在向量数组中的第i 个向量的后面放置一个元素!更糟糕的是,该数组为空,因此访问无效。

如果不是,您将得到i个向量,每个向量都有一个元素。不好!<​​/ p>

相反,您可以将向量设置为一定大小:

MyVec.resize(SomeSize);

…然后分配元素,就好像向量是一个数组(某种意义上是这样):

MyVec[i] = thing;

这里的关键是您没有 push_back;仅在要将新元素推到向量的背面时才这样做。您可以使用类似数组[]的语法访问现有值。

在您的C ++书籍中详细了解向量。