lod*_*kkx 4 c++ algorithm stl vector
我有逗号分隔的字符串,我需要从中提取值.问题是这些字符串永远不会是固定大小.所以我决定迭代逗号组并阅读其间的内容.为了做到这一点,我创建了一个函数,它返回样本字符串中每个匹配项的位置.
这是一个聪明的方法吗?这被认为是不好的代码吗?
#include <string>
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;
vector<int> findLocation(string sample, char findIt);
int main()
{
string test = "19,,112456.0,a,34656";
char findIt = ',';
vector<int> results = findLocation(test,findIt);
return 0;
}
vector<int> findLocation(string sample, char findIt)
{
vector<int> characterLocations;
for(int i =0; i < sample.size(); i++)
if(sample[i] == findIt)
characterLocations.push_back(sample[i]);
return characterLocations;
}
Run Code Online (Sandbox Code Playgroud)
小智 12
vector<int> findLocation(string sample, char findIt)
{
vector<int> characterLocations;
for(int i =0; i < sample.size(); i++)
if(sample[i] == findIt)
characterLocations.push_back(sample[i]);
return characterLocations;
}
Run Code Online (Sandbox Code Playgroud)
正如目前所写,如果我正确地阅读你的问题,这将简单地返回一个包含字符本身的int表示的向量,而不是它们的位置,这正是你真正想要的.
替换此行:
characterLocations.push_back(sample[i]);
Run Code Online (Sandbox Code Playgroud)
用这一行:
characterLocations.push_back(i);
Run Code Online (Sandbox Code Playgroud)
这应该会给你你想要的矢量.
如果我正在审查这个,我会看到这一点,并假设你真正想做的是标记一个字符串,并且已经有很好的方法来做到这一点.
我见过这样做的最佳方式是boost::tokenizer.它允许您指定字符串的分隔方式,然后为您提供一个很好的迭代器接口来迭代每个值.
using namespace boost;
string sample = "Hello,My,Name,Is,Doug";
escaped_list_seperator<char> sep("" /*escape char*/, ","/*seperator*/, "" /*quotes*/)
tokenizer<escaped_list_seperator<char> > myTokens(sample, sep)
//iterate through the contents
for (tokenizer<escaped_list_seperator<char>>::iterator iter = myTokens.begin();
iter != myTokens.end();
++iter)
{
std::cout << *iter << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello
My
Name
Is
Doug
Run Code Online (Sandbox Code Playgroud)
编辑如果您不希望依赖于提升,您也可以使用此答案中getline的istringstreamas .要从那个答案中复制一下:
std::string str = "Hello,My,Name,Is,Doug";
std::istringstream stream(str);
std::string tok1;
while (stream)
{
std::getline(stream, tok1, ',');
std::cout << tok1 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Hello
My
Name
Is
Doug
Run Code Online (Sandbox Code Playgroud)
这可能不是你要问的直接问题,但我认为它会解决你正试图解决的整体问题.
| 归档时间: |
|
| 查看次数: |
16552 次 |
| 最近记录: |