循环几个向量

时间:2012-01-27 01:29:05

标签: c++

我无法搜索潜在的重复项,因为我不确定正确的术语是什么。

如果我有许多已经创建的向量,我该如何循环它们?为简单起见,假设我有三个名为"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循环相同,但是更具可读性,实际上我的非简单应用程序中有三个以上。

请注意,因为我需要访问矢量名称(请参阅注释),所以我不能将它们全部合并在一起然后运行一个循环。

3 个答案:

答案 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)

可能最简单的方法是将你的矢量放在一个数组中(如果有一个可变数量的矢量,则为矢量矢量)。

我猜你也想要一组“矢量名”来满足你的第二个条件。