字符串、列表或其他东西的向量? C++

Posted

技术标签:

【中文标题】字符串、列表或其他东西的向量? C++【英文标题】:Vector of Strings, List or something else? C++ 【发布时间】:2013-08-27 06:59:53 【问题描述】:

我目前有一个已自动协作到 txt 文件中的数据列表。目前我正在将它加载到一个缓冲区中,根据新行对其进行分段并将每一行添加到一个向量字符串中。目前的最终结果:我有一个字符串向量(已确认使用 cout)。

我的问题是,我需要删除每个部分的各个部分,在某些情况下,出于格式化原因,我需要剪切部分并移动它们,类似于数据库。

例如

1. Bernice Armstrong asd-ssdd 123123
2. Johnathan Potter asd-ssdd 123123
3. Kay Dixon asd-ssdd 123123
4. Melba Barton asd-ssdd 123123
5. Alison Malone asd-ssdd 123123
6. Mercedes Hale asd-ssdd 123123
7. Carolyn Rodriquez
asd-ssdd 123123
8. Norma Banks asd-ssdd 123123
9. Homer Burke asd-ssdd 123123
10. Mary Kelly asd-ssdd 123123

我需要剪切第 8 行并将其附加到 Carolyn Rodriquez 的末尾。我似乎在尝试使用矢量类执行字符串命令来测试大小时遇到​​困难。

vector<string> myvect;
//...

if(strlen(myvect[2])<16)
    myvect.erase (i);

最终结果是一个 CSV 文件,每行都有名字和姓氏,仅此而已。 我应该如何使用内置库来解决这个问题?我是否正在寻找正确的应用程序,或者列表或其他方法会更容易吗?


到目前为止我所拥有的:

int PostProcess(std::ofstream &file, char* pbuffer, size_t len)

    char * buffer = pbuffer;

    char tmp[160];
    vector<string> data;
    string line;

    unsigned int initial = 0;
    int count = 0;
    //dynamically assign array of memory

    for (unsigned int pos = 0; pos< len;pos++)
    
        tmp[count] = *buffer;
        if ((*buffer) == '\n')
        
            tmp[count+1] = 0;
            line = tmp;
            data.push_back(line);
            initial = pos;
        
        if (count >= 150)
            break;
        buffer++;
        count = pos - initial;
    
    //debugger - shows all data in vector
    for (std::vector<string>::const_iterator i = data.begin(); i != data.end(); ++i)
        std::cout << *i << ' ';
    //end debug code
    buffer = pbuffer;

    file << buffer;
    return 0;

【问题讨论】:

您必须提供有关输入格式的更多信息。在我看来,您应该在解析期间解决问题,而不是在将数据存储在某个容器中之后。 您不能在std::string 上使用strlen(它甚至可以编译吗?)。使用例如myvect[2].length(). 在我看来,您最好先解析输入(即从一行中获取名字/姓氏),然后将其存储在例如 vector&lt; pair&lt; string, string &gt; &gt; 中,因为这与最终结果正确匹配你真的需要吗? 为.length 成员干杯!一些名字和姓氏是空格分隔的,例如。朱莉娅·路易斯·史密斯。因为我知道两边有多少空间分隔,我可以在后期处理中知道名称在哪里。第一个名字大写,最后一个小写。在发布的问题的情况下,我需要重新对齐所有数据,然后才能正确分析它(或者我认为。向量的成员函数是否可以工作,以便我可以将字符串编辑为向量的元素?通过strcat 之类的命令?还是最好将其复制到字符串编辑和覆盖? @Larry:strcat,和strlen一样的问题。 C 字符串函数不适用于std::stringstd::string 与简单的 +/+= 连接。 【参考方案1】:

就存储而言,我认为 stijn 的想法是将名称作为对存储在您的向量中的好主意,但对您来说最简单的方法!

这里有一些粗略的快速编写和未经测试的示例代码,可以帮助您开始:

char *start = pBuffer;
char *end = pBuffer;
char *max = (pBuffer + len);
vector<pair<string, string>> name_vect;

for (unsigned int pos = 0; pos < len; pos++)

    string name_first;
    string name second;

    // Get first name
    while (*end != ' ' && end <= max) end++;
    name_first.assign(start, end - start);
    start = ++end; // move pointers on

    // Get second name
    while (*end != ' ' && end <= max) end++;
    name_second.assign(start, end - start);
    start = ++end; // move pointers on

    // Move to the end of the line
    while (*end != '\n' && end <= max) end++;
    start = ++end; // move pointers on

    // Now we have a named pair add them to the vector
    name_vect.pushback(std::make_pair (name_first, name_second));

...一个粗略的例子,你可以如何让你的列表尽量不改变你的代码:) 如果您想稍后移动内容,请使用 vector.erase() 和 vector.insert() 删除和添加实体。

如果您想将整行存储为 std::strings,则可以使用 substr() 函数来选择该字符串的一部分。

【讨论】:

【参考方案2】:

我会将数据读入一个合适的结构并打印出我需要的内容

#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>

struct Data

    size_t num;
    std::string name;
    std::string surname;
    std::string code;
    size_t id;
;

std::istream& operator>>(std::istream& is, Data& d)

    is >> d.num;
    is.ignore(2);    // skip '. '
    is >> d.name;    // take into consideration that 
    is >> d.surname; // a name or surname like 'de palma' will
    is >> d.code; //not work 
    is >> d.id;      

    return is;


std::ostream& operator<<(std::ostream& os, const Data& d)

    // Do everything you need here 
    // in term of formatting

    os << d.name << "," << d.surname;
    return os;


int main(int argc, char *argv[])

    if (argc == 1)  std::cerr << "please give me a file to process" << std::endl; return 0; 
    std::ifstream ifStream(argv[1]); // consider to have a file with data in it
    std::istream_iterator<Data> begin(ifStream);
    std::istream_iterator<Data> end;
    std::vector<Data> data (begin, end);

    std::copy(data.begin(),
              data.end(),
              std::ostream_iterator<Data>(std::cout, "\n"));
    return 0;

【讨论】:

以上是关于字符串、列表或其他东西的向量? C++的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中嵌入 Python。传递接收列表列表的字符串向量

如何使用字符串或字符向量(分别包含任何化学成分公式)并计算其摩尔质量?

c++ 中将标准输入内容读入字符串或向量的最快方法

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

如何在 C++ 中的字符串向量中找到重复的单词?

如何解决以下错误?输入必须是任意长度的字符向量或字符向量列表,每个字符向量的长度为1