将字符串列表插入二维向量

Posted

技术标签:

【中文标题】将字符串列表插入二维向量【英文标题】:Insert list of strings into 2d vector 【发布时间】:2016-02-22 03:13:48 【问题描述】:

我正在尝试获取一个列表,并根据列表中的字符串在二维向量中创建一个新行。我是 C++ 新手,有几个问题:

1) 我是否能够遍历列表,并获取迭代器当前所在的字符串?如果是这样,我怎样才能将该字符串添加到向量中?

2) 我如何在二维向量中实现它?

3) 在初始化二维向量时,在插入每个元素时,推回是否能够增加大小?我目前将其初始化为 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++;
    

提前致谢。

【问题讨论】:

“我可以遍历列表吗?” - 我不知道,是吗? - “并获取迭代器当前所在的字符串?” - 如果不能,迭代有什么意义? 检查是否有值,或者是否有一定数量的值? 【参考方案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

【讨论】:

我想你可以用迭代器抓取字符串,只是遇到了问题,所以我想确保它是可能的。 我也会给预备队一个机会!【参考方案2】:
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,但又想预留空间,也可以使用vector.reserve()

【讨论】:

以上是关于将字符串列表插入二维向量的主要内容,如果未能解决你的问题,请参考以下文章

将字符串向量转换为双二维数组向量

如何将字符串的字符推入二维向量[关闭]

R基础:R语言数据结构1

将文本文件读入二维向量。 C++

将预定的日期时间值插入 SQL 表

R语言unlist函数将复杂数据(list列表dataframe字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)