首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列表-用两个vector<string>指针初始化一个char[]

列表-用两个vector<string>指针初始化一个char[]
EN

Stack Overflow用户
提问于 2017-06-19 02:13:43
回答 1查看 370关注 0票数 2

我在命令行运行一个C++ 11程序,如下所示,

marco@host $ ./program.out a bb ccc

用于使可执行文件看起来如下所示的.cpp文件:

代码语言:javascript
复制
#include<iostream>
#include<vector>
#include<string>

int main(int argc, char* argv[]){
  std::vector<std::string> strs = {argv + 1, argv + argc};
  std::cout << strs[2] << endl;
  return 0;
}

当我运行它时,它输出ccc。这是我没想到的,因为列表初始化程序只包含char*类型的两个元素。我以前见过这样的列表:

代码语言:javascript
复制
vector<string> strs = {"str1", "str2", ..., "strN"};

但是指针对我来说是全新的。似乎指针被视为开始迭代器和结束迭代器。我的问题是,编译器如何知道如何从argv +1迭代到argv + argc来初始化strs中的各个字符串?仅仅为了把事情放在上下文中,是否有一种方法可以在C中以类似的方式使用列表初始化来初始化char*数组?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-19 02:24:28

argvchar *的数组。正如您所知道的,如果您不仔细地将数组聚在一起,数组就有一种将指针衰减到指针的习惯。因此:

代码语言:javascript
复制
{argv + 1, argv + argc}

这两个表达式都会产生char **

您认为您只是在这里做一个普通的数组/向量初始化。你不是。这很有误导性,但事实并非如此。显然,您不能用std::strings初始化char **,如果这是花园品种列表初始化的话,情况就是如此。

这实际上是使用统一的初始化语法进行解析。在C++11之前,这相当于:

代码语言:javascript
复制
std::vector<std::string> strs(argv + 1, argv + argc);

(仅为说明目的,这里忽略了最令人烦恼的解析问题)。

您要做的是使用它的构造函数构造一个向量,该构造函数以序列的结束迭代器作为开头。std::vector有一堆构造函数。其中之一是一个模板,它接受序列的起始迭代器和结束迭代器,并将整个过程放入向量中。这就是你在这里要做的。

这实际上是用整个argv填充向量(除了argv之外)。这就是为什么你看到你看到的结果。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44621366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档