如何在字符串向量中的每个字符串中迭代字符

How to iterate through characters in each string in a vector of strings?

本文关键字:字符串 迭代 字符 向量      更新时间:2024-04-28

尝试从向量迭代每个字符串中的每个字符,并验证所有字符都是"O"或"。">

//read file, put it in vector, and handle some errors
string line;
vector<string> currentgen; 
while (getline(input_stream, line)) {
currentgen.push_back(line);
}
//iterate through every character in each string, 
//and verify all characters are 'O' or '.' 
for(int i = 0; i < currentgen.size(); i++){
for(int j = 0; j < i.length(); j++){
if(currentgen[i][j] != 'O' || currentgen[i][j] != '.'){
cerr << program_name << ": Bad Character in: "<<file_name<< "n";
exit(3)
}
}
}

这给出了一个错误:

错误:不同有符号性的整数表达式的比较:'int'和'std::vector<std::__cxx11::basic_string<char>>::size_type'{aka'long unsigned int'}对于(int i=0;i<currentgen.size((;i++({

从c++20,您可以迭代字符串向量中的每个字符,如下所示:

for(char c : currentgen | std::views::join | std::views::join)
{   
// ...
}

这是一个演示。


当然,你最好使用一种算法,而不是手动迭代字符:

auto O_or_dot = [](char c) { return c == 'O' || c == '.'; };
if (not std::ranges::all_of(currentgen 
| std::views::join 
| std::views::join, O_or_dot))
cerr << program_name << ": Bad Character in: "<<file_name<< "n";

这是一个演示。

问题:

  1. 您使用了本应使用&&||;显然,一个字符总是不等于'O''.'中的一个,因此条件在书写时总是成立的;你想要:

    if(currentgen[i][j] != 'O' && currentgen[i][j] != '.'){
    ^^ changed
    
  2. exit(3)后还有一个缺失的分号

  3. 出现了警告,使用int作为迭代变量让人很生气;使其成为size_t可能会修复错误(尽管从技术上讲,正确的更改是使其成为vector<string>::size_type(。一个更好的解决方案是让C++用一个for each循环来处理迭代,比如:

    for(const auto& str : currentgen){
    

    然后首先避免对该循环进行索引。