我无法搜索潜在的重复项,因为我不确定正确的术语是什么。
如果我有许多已经创建的向量,我该如何循环它们?为简单起见,假设我有三个名为"vec_one"
,"vec_two"
,"vec_three"
的字符串向量。
我想做类似的事情:
for i in ("vec_one", "vec_two", "vec_three") {
for (vector<string>::const_iterator iter = i.begin(); iter != i.end(); ++iter) {
//do something with the elements ***and I need to access "i"***, that is, the vector name.
}
}
这与编写三个不同的for循环相同,但是更具可读性,实际上我的非简单应用程序中有三个以上。
请注意,因为我需要访问矢量名称(请参阅注释),所以我不能将它们全部合并在一起然后运行一个循环。
答案 0 :(得分:6)
您可以使用数组执行此操作:
const vector<string>* varr[] = { &vec_one, &vec_two, &vec_three, &etc };
for (auto vec = begin(varr); vec < end(varr); ++vec)
for (vector<string>::const_iterator iter = begin(**vec); iter != end(**vec); ++iter)
//do something with the elements
答案 1 :(得分:1)
您可以将矢量放在vector<std::pair<std::string, std::vector<...>*>
:
std::vector<std::pair<std::string, std::vector<std::string>*> > vectors;
vectors.emplace_back(std::string("vec_one"), &vec_one); //or push_back(std::make_pair(...)) in C++03
vectors.emplace_back(std::string("vec_two"), &vec_two);
vectors.emplace_back(std::string("vec_three"), &vec_three);
for(auto iter = vectors.begin(); iter != vectors.end(); ++iter)//used c++11 auto here for brevity, but that isn't necessary if C++11 is not availible
for(auto vecIter = iter->second->begin(); vecIter != iter->second->end(); ++vecIter)
//get name with iter->first, body here
通过这种方式,您可以轻松地从外部迭代器获取名称。
如果您使用C ++ 11,则可以改为使用std::array
:
std::array<std::pair<std::string, std::vector<std::string>*>, 3> vectors =
{
std::make_pair(std::string("vec_one"), &vec_one),
std::make_pair(std::string("vec_two"), &vec_two),
std::make_pair(std::string("vec_three"), &vec_three)
};
在C ++ 03中,您可以使用buildin数组,但除非vector
的额外开销对您来说是个问题(不太可能),否则我没有看到令人信服的理由。如果您不能使用C ++ 11
boost::array
也是一个值得注意的替代方案
如果确实需要绝对最佳性能,可能需要直接使用const char*
代替std::string
作为名称。
答案 2 :(得分:0)
可能最简单的方法是将你的矢量放在一个数组中(如果有一个可变数量的矢量,则为矢量矢量)。
我猜你也想要一组“矢量名”来满足你的第二个条件。