我试图获取一个列表,并根据列表中的字符串在2d向量中创建一个新行。我是c ++的新手,有几个问题:
1)我能够遍历列表,并获取迭代器当前所在的字符串吗?如果是这样,我怎么能将该字符串添加到向量中?
2)我如何在二维矢量中实现它?
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++;
}
}
提前致谢。
答案 0 :(得分: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()
答案 1 :(得分: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)我如何在二维矢量中实现它?
在回答这个问题之前,需要通过问题1找出你真正想要做的事情。
3)初始化2d向量时,在插入每个元素时,是否会推迟工作以增加大小?...
是
...我目前在10岁时将其初始化,但是希望将其初始化为0,并在插入字符串时增加向量。 (不确定这是否是最佳方法)
是的,你可以随时使用push_back
。如果您知道自己需要大量容量并且关注效率,请考虑使用vector::reserve
。