迭代c++中包含字符串向量的指针集

Iterate through a pointer set that contains string vectors in C++

本文关键字:指针 向量 字符串 c++ 包含 迭代      更新时间:2023-10-16

这是我对集合的声明:

set< vector<string> >* tuples = new set< vector<string> >();

这就是我尝试遍历它的方式:

for(set< vector<string> >::iterator it = tuples->begin(); it != tuples->end(); it++){
    if(it[column] == value){
        rowResults->insert(*it);
    }
}

但是我得到一个错误

no match for ‘operator[]’ (operand types are ‘std::set<std::vector<std::__cxx11::basic_string<char> > >::iterator {aka std::_Rb_tree_const_iterator<std::vector<std::__cxx11::basic_string<char> > >}’ and ‘int’)
    if(it[column] == value){
         ^

您将[]应用于迭代器,而不是应用于它所指向的对象。需要对迭代器解引用(并注意操作符的优先级!):

for(set< vector<string> >::iterator it = tuples->begin(); it != tuples->end(); ++it){
    if((*it)[column] == value){
        rowResults->insert(*it);
    }
}

请注意,对于迭代器,在循环中最好使用++it而不是it++,因为后者在优化不足的情况下效率较低。

it是一个迭代器,而不是vector对象本身。使用*it

访问vector对象

更好的方法是:通过定义对元素本身的引用(这里是常量ref,因为我们似乎不需要非const)来摆脱令人困惑的迭代器类型。

for(set< vector<string> >::iterator it = tuples->begin(); it != tuples->end(); it++){
    const vector<string> &v = *it;  // more readable
    if(v[column] == value){
        rowResults->insert(v);
    }
}

作为没有像样的c++答案不能提到"新"c++ 11,注意,如果您使用-std=c++11选项,语法更好地迭代列表

for(auto v : *tuples)
{
    if(v[column] == value){
        rowResults->insert(v);
    }
}

你可以这样避免使用迭代器:

std::set<std::vector<std::string>>
computeRowResult(const std::set<std::vector<std::string>>& input,
                 int column,
                 const std::string& value)
{
    std::set<std::vector<std::string>> rowResults;
    for (const auto& v : input) {
        if (v[column] == value) {
            rowResults.insert(v);
        }
    }
    return rowResults;
}

或避免使用

手动循环
std::set<std::vector<std::string>>
computeRowResult(const std::set<std::vector<std::string>>& input,
                 int column,
                 const std::string& value)
{
    std::set<std::vector<std::string>> rowResults;
    std::copy_if(input.begin(), input.end(),
                 std::inserter(rowResults, rowResults.end()),
                 [&](const auto& v) { return v[column] == value; });
    return rowResults;
}
演示