2016-02-22 2 views
0

Я пытаюсь взять список и в зависимости от строки в списке создает новую строку в векторе 2d. Я новичок в C++ и задаю несколько вопросов:Вставить список строк в 2d-вектор

1) Могу ли я перебирать список и захватывать строку, в которой сейчас находится итератор? Если да, то как я могу добавить эту строку в вектор?

2) Как я могу реализовать это в 2d-векторе?

3) При инициализации 2d-вектора была бы функция pushback, чтобы иметь возможность увеличить размер при вставке каждого элемента? В настоящее время я инициализирую его в 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++; 
    } 
} 

Заранее спасибо.

+0

«Могу ли я пройти через список» - я не знаю, не так ли? - "и захватить строку, в которой сейчас находится итератор?" - Какой смысл повторять, если бы вы не могли? – immibis

+0

Проверить, имеет ли оно значение или имеет ли оно определенное количество значений? – Slae

ответ

1

Я думаю, что здесь нужен больше контекста, но я предполагаю, что вы хотите что-то вроде это:

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-вектора была бы функция pushback, чтобы иметь возможность увеличить размер при вставке каждого элемента? ...

Да.

... В настоящее время я инициализирую его в 10, но хотел бы инициализировать его в 0 и увеличить векторы при вставке строк. (Не уверен, что это лучший подход)

Да, используя push_back, как вы идете, это прекрасно. Если вы знаете, что вам нужна большая мощность и вы обеспокоены эффективностью, подумайте об использовании vector::reserve.

+0

Я решил, что вы можете схватить строку с помощью итератора, просто возникли проблемы с ней, поэтому я хотел убедиться, что это возможно. – Slae

+0

Я тоже дам резерв! – Slae

1
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()