字符串、列表或其他东西的向量? 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< pair< string, string > >
中,因为这与最终结果正确匹配你真的需要吗?
为.length 成员干杯!一些名字和姓氏是空格分隔的,例如。朱莉娅·路易斯·史密斯。因为我知道两边有多少空间分隔,我可以在后期处理中知道名称在哪里。第一个名字大写,最后一个小写。在发布的问题的情况下,我需要重新对齐所有数据,然后才能正确分析它(或者我认为。向量的成员函数是否可以工作,以便我可以将字符串编辑为向量的元素?通过strcat 之类的命令?还是最好将其复制到字符串编辑和覆盖?
@Larry:strcat
,和strlen
一样的问题。 C 字符串函数不适用于std::string
。 std::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。传递接收列表列表的字符串向量