【发布时间】:2014-08-06 03:16:51
【问题描述】:
我对编程比较陌生,目前正在学习 C++。我怀疑我的逻辑是否正确,但这是我一直在努力解决的问题:
我有一个简单的程序,可以输出向量的大小和内容;
vector<int> v1;
vector<int> v2(10);
vector<int> v3(10, 42);
vector<int> v4{ 10 };
vector<int> v5{ 10, 42 };
vector<string> v6{ 10 };
vector<string> v7{ 10, "hi" };
//and so on...........
bool firstPass= true;
for (auto i : v3){
if (firstPass) cout << "Vector size: " << v3.size() << ".\nElements: " << i << ", ";
cout << i << ", ";
firstPass= false;
}
如果我想遍历另一个向量,我必须手动将 v3 更改为 vX,但我希望这段 sn-p 代码能够遍历所有向量。
我尝试了几种方法,例如创建一个
vector<string> V8{"v1","v2","v3"..}for (auto i : V8[counter])
但基本上我失败了,因为“v1”!= v1。(这是我得到“将字符串转换为向量”的想法的地方,但有些事情告诉我这不是这样做的方法.. .)
任何帮助和批评都将不胜感激,我很抱歉,因为考虑到我试图解决这个问题的方法可能有问题,我提出了错误的问题,这可能会被提交得太具体甚至无用!
【问题讨论】:
-
如果你想迭代向量,最简单的方法是将它们全部放在一个可迭代的容器中 - 例如另一个向量。所以,你有
vector<vector<int>> = { { }, {10}, {10,42}, {10}, {10,42} };。然后,您可以使用嵌套的for循环进行迭代。但是你不能这么容易地混合字符串——你可以有一个单独的vector<vector<string>>,或者你可以使用变体创建一个抽象层(boost::any、boost::variant,一个面向向量的OO运行时多态层次结构)。 . 它可能超出了你准备写的范围。 -
或者,如果您的向量已经存在,您可以创建一个指向现有向量的向量(或只是一个初始化列表)。 (但您仍然需要不同类型向量的单独集合。)
-
@TonyD,向量的向量听起来不错,但我特别受到与以前相同的问题的困扰;我如何将大量现有向量添加到
vector<vector<int>>,而不必为每个向量添加vectorOfVectors.push_back(vectorName)?以下代码每次都会写入 v1,v2,v3 来代替vectorName,但这些都是字符串,因此类型错误:vectorOfVectors.push_back("v"+to.string(counter)) counter++; -
@Boop 这不是语言的工作方式。您必须以某种方式 解决目标中的项目,并且在 C++ 中最终在编译时以 id 开头;不是运行时。该 id 可以是向量的向量,数组,你有什么,但它必须是编译时知道的不知何故。如果它是您自己的类,您可以维护一个实时的对象静态列表并转储该列表,但标准库不提供此类工具。 也许 是一个模板包装器,但我不明白这有什么值得麻烦的。可变参数预处理可能有优点,但同样,你必须不想要它。
-
@Boop:你有多少这样的向量?
标签: c++ vector data-conversion