0

请参阅此代码。我需要使用迭代器更改 2D 字符串向量中特定元素的值。我可以使用带有索引的 for 循环来执行此操作。但这里我需要的是直接使用迭代器来引用元素。任何想法(*ite)[0] = "new name" ?为了您的方便,我在这里添加了完整的工作代码

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;


string convertInt(int number)
{
   stringstream ss;
   ss << number;
   return ss.str();
}

int main()
{
    vector<vector<string>> studentList;
    for(int i=0; i<10; i++){
        vector<string> student;
        student.push_back("name-"+convertInt(i));
        student.push_back(convertInt(i+10));
        studentList.push_back(student);
    }
    vector<string> temp;
    for(vector<vector<string>>::iterator ite = studentList.begin(); ite != studentList.end(); ++ite){
        temp = *ite;
        if(temp[0].compare("name-5")==0){
            cout << "Changeing the name of student 5" << endl;
            // I need to change the studentList[5][0] (original value not the one in temp vector) at here using iterator ite
        }
    }
return 0;
}
4

2 回答 2

0

因为temp = *ite复制了 vector( student ),如果你修改 on temp,它不会在 real 上修改studentList,这就是为什么你需要(*ite)[0] = "new name"改变 real 元素的值。

使用 for 循环有点“丑陋”,使用std::find_if代替 for 循环:

bool IsFindFifthName(const std::vector<std::string>& student)
{
   return student[0] == "name-5";
}

 std::vector<std::vector<std::string>>::iterator iter 
  = std::find_if(studentList.begin(), studentList.end(), IsFindFifthName);

if (iter != studentList.end() )
{
   (*iter)[0] = " new name";       
}

或者如果 C++11 可用,则使用 Lambda:

std::vector<std::vector<std::string>>::iterator iter 
  = std::find_if(studentList.begin(), studentList.end(), 
    [](std::vector<std::string>& student){ return student[0] == "name-5"; });

 if (iter != studentList.end() )
 {
    (*iter)[0] = " new name";       
 }
于 2013-02-05T06:17:03.080 回答
0

以防万一使用 STL 算法变换可能是一个不错的选择。该算法在内部使用迭代器。一个示例:

typedef std::vector<std::string> VectorOfString;
void DisplayStudent(const std::vector<VectorOfString>& StudentList)
{
    std::for_each(StudentList.cbegin(), StudentList.cend(), 
        [](const VectorOfString& vectorElement)
    {
        std::for_each(vectorElement.cbegin(), vectorElement.cend(), 
            [](const std::string& value)
        {
            std::cout << value << endl;
        });     
    });
}

std::vector<VectorOfString> StudentList;

std::string data1 = "One";
std::string data2 = "Two";

VectorOfString data(2);
data.push_back(data1);
data.push_back(data2);

StudentList.push_back(data);



DisplayStudent(StudentList);

std::for_each(std::begin(StudentList), std::end(StudentList), 
    [](VectorOfString& vectorElement)
{
    std::transform(std::begin(vectorElement), std::end(vectorElement), std::begin(vectorElement),
        [](std::string& value)-> std::string
    {
        if(value.compare("One") == 0)
            return "OneOne";
        else
            return value;
    });     
});

DisplayStudent(StudentList);
于 2013-02-05T06:53:54.573 回答