Вставить список строк в 2d вектор
Я пытаюсь взять список, и в зависимости от строки в списке, создает новую строку в 2d вектора. Я новичок в C++ и у меня есть несколько вопросов:
1) Могу ли я перебрать список и получить строку, в которой находится итератор? Если так, как я могу добавить эту строку в вектор?
2) Как я могу реализовать это в 2d вектор?
3) При инициализации 2d вектора, сработает ли откат назад, чтобы иметь возможность увеличивать размер при вставке каждого элемента? В настоящее время я инициализирую его в 10, но хотел бы инициализировать его в 0 и увеличивать векторы при вставке строк. (Не уверен, что это лучший подход)
std::vector<std::vector<string> >myVector(10, std::vector<string>(10));
std::list<string> myList;
list<string>::iterator i;
inputList(myList);
int vectorRow = 0;
int vectorCol = 0;
//Insert list into vector
for (i = myList.begin(); i != myList.end(); i++) {
//add to the current row of the vector
if (*i == "endOfRow"){
vectorRow++;
vectorCol = 0;
} else {
//add to the column of the vector
vectorCol++;
}
}
Заранее спасибо.
2 ответа
Я думаю, что здесь нужно больше контекста, но я предполагаю, что вы хотите что-то вроде этого:
std::vector<std::vector<string> > myVector(1);
std::list<string> myList;
inputList(myList);
//Insert list into vector
for (list<string>::iterator i = myList.begin(); i != myList.end(); i++) {
//add to the current row of the vector
if (*i == "endOfRow"){
myVector.push_back(std::vector<string>());
} else {
//add to the column of the vector
myVector.back().push_back(*i);
}
}
1) Могу ли я перебрать список и получить строку, в которой находится итератор? Если так, как я могу добавить эту строку в вектор?
Вы можете, но вы также можете просто получить строку, на которую указывает ваш итератор, разыменовав ее, например, если ваш итератор вызывается iter
тогда просто пишешь *iter
, Я смущен, хотя, потому что ваш пример, кажется, уже делает это.
2) Как я могу реализовать это в 2d вектор?
Прежде чем ответить на этот вопрос, нужно выяснить, что вы действительно пытаетесь сделать, проработав вопрос 1.
3) При инициализации 2d вектора, сработает ли откат назад, чтобы иметь возможность увеличить размер при вставке каждого элемента?...
Да.
... В настоящее время я инициализирую его в 10, но хотел бы инициализировать его в 0 и увеличивать векторы при вставке строк. (Не уверен, что это лучший подход)
Да использую push_back
как вы идете в порядке. Если вы знаете, что вам понадобится много возможностей и вы заинтересованы в эффективности, рассмотрите возможность использования vector::reserve
,
std::list<std::string> myList;
inputList(myList);
std::vector<std::vector<std::string>>myVector(1);
for (const auto& str : myList)
{
if (str == "endOfRow")
myVector.push_back({});
else
myVector.back().emplace_back(str);
}
if (myList.empty())
myVector.clear();
// there is no need to update these values inside the loop
int vectorRow = (int)myVector.size();
int vectorCol = (int)myVector.back().size();
1) Могу ли я перебрать список и получить строку, в которой находится итератор? Если так, как я могу добавить эту строку в вектор?
Да. То, как вы делаете это правильно, но вы можете использовать лучший синтаксис. Чтобы добавить его в вектор, просто emplace_back() или push_back ().
3) При инициализации 2d вектора, сработает ли откат назад, чтобы иметь возможность увеличивать размер при вставке каждого элемента?
Будет. Но, как вы сказали, если вы знаете размер списка в начале, вы можете легко инициализировать его, чтобы сделать его более оптимизированным. Если вы не хотите инициализировать вектор, но по-прежнему хотите зарезервировать пространство, вы также можете использовать vector.reserve()