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

場合によっては、STL アルゴリズム Transform を使用するのが適切なオプションになる可能性があります。アルゴリズムは内部的に反復子を使用します。サンプル例:

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 に答える
0

temp = *itevector( student )のコピーを作成するため、 on を変更しtempても real では変更されないため、 real 要素の値を変更studentListする必要があります。(*ite)[0] = "new name"

for ループの使用は少し "醜い"ため、for ループの代わりにstd::find_ifを使用します。

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 に答える