如何在C++ vector中使用带参构造函数创建File对象?
处理命令行参数初始化std::vector的实现方案
基础循环遍历实现
这是最直观的实现方式,直接遍历命令行参数(跳过程序名argv[0]),逐个构造File对象并添加到容器中:
#include <vector> #include <string> #include "File.h" int main(int argc, char* argv[]) { std::vector<File> files; // 跳过argv[0](程序自身路径),遍历所有传入的文件名 for (int i = 1; i < argc; ++i) { // emplace_back直接在vector内存中构造File对象,避免临时对象拷贝 files.emplace_back(argv[i]); // 若编译器版本较低,可替换为:files.push_back(File(argv[i])); } // 后续数据库逻辑处理 return 0; }
利用std::transform简化遍历(C++11及以上)
通过标准库算法std::transform批量转换命令行参数为File对象,配合back_inserter自动插入容器:
#include <vector> #include <string> #include <algorithm> #include <iterator> #include "File.h" int main(int argc, char* argv[]) { std::vector<File> files; // 遍历argv[1]到argv[argc-1]的所有文件名 std::transform(argv + 1, argv + argc, std::back_inserter(files), [](const char* filename) { return File(filename); }); // 后续数据库逻辑处理 return 0; }
C++17范围for简化写法
先将C风格的命令行参数转为std::string容器,再用范围for循环构造对象:
#include <vector> #include <string> #include "File.h" int main(int argc, char* argv[]) { std::vector<File> files; // 先把argv的文件名部分转为std::vector<std::string> const std::vector<std::string> filenames(argv + 1, argv + argc); for (const auto& name : filenames) { files.emplace_back(name); } // 后续数据库逻辑处理 return 0; }
注意事项
- 若没有传入任何.txt文件参数,
argc等于1,此时容器会保持为空,可根据需求添加参数校验逻辑 - 如果
File类的构造函数可能抛出异常(比如文件不存在),建议在循环内添加异常捕获逻辑 emplace_back相比push_back更高效,因为它直接在容器的内存空间中构造对象,避免了临时对象的拷贝或移动操作
内容的提问来源于stack exchange,提问作者Bl4ck Spyrit
相关产品推荐
相关产品推荐

