std::find не работает должным образом

std::find не выполняет оценку, как я ожидал.

У меня есть векторная лексема_, определенная как

static const std::string delimiters_[] = {" ", ",", "(", ")", ";", "=", ".", "*", "-"};

static std::vector<std::string> lexeme_(std::begin(delimiters_), std::end(delimiters_));

У меня есть оценка с использованием std::find, определяемая как

while ( std::find(lexeme_.begin(),lexeme_.end(),std::string(&commandLine_.at(position_))) == lexeme_.end())             
{
    // Concat each successive alphanumeric character to 'token'
    token += commandLine_.at(position_);
    // Update the index into 'commandLine'
    position_ += 1;
}

Предполагается, что оценка сравнивает char в лексеме_ с char в командной строке, похожей на это выражение Java.

!lexeme.contains(Character.toString(commandLine.charAt(position)))  

Предполагается, что оценка сравнивает chars, и если она определяет, что char в delimiters удовлетворяется при сравнении, тогда цикл while завершается.

Прецедент

#include<algorithm>
#include<iostream>    

static const std::string delimiters_[] = {" ", ",", "(", ")", ";", "=", ".", "*", "-"};

static std::vector<std::string> lexeme_(std::begin(delimiters_), std::end(delimiters_));

std::string commandLine = "check me";

while (std::find(lexeme_.begin(),lexeme_.end(),std::string(&commandLine_.at(position_))) == lexeme_.end())             
{
    std::cout "I should stop printing when encountering a space ' ' << std::endl;
}

person Mushy    schedule 08.04.2013    source источник
comment
Можете ли вы построить полный тестовый пример, чтобы продемонстрировать это?   -  person Oliver Charlesworth    schedule 09.04.2013
comment
@DrewDormann нуждается в цитировании. Как говорится, это нелепо. Это точно не быстрее.   -  person sehe    schedule 09.04.2013
comment
Так в чем проблема? Что делает этот код, и что вы от него ожидаете, и чем то, что он делает, отличается от того, что вы от него ожидаете? Короче говоря, whathaveyoutried.com   -  person jalf    schedule 09.04.2013
comment
Похоже, вы пытаетесь создать парсер (выражения). Хотите помочь с этим? См., например. Парсер выражений, Проверка алгебраических выражений, Пример калькулятора (обратите внимание, мне нравится boost-spirit и coco-cpp)   -  person sehe    schedule 09.04.2013
comment
@DrewDormann Вам придется предъявить доказательства этого утверждения.   -  person Etienne de Martel    schedule 09.04.2013


Ответы (2)


Конструктор для вашей временной строки сравнения неверен. Он не строит односимвольную строку, а строит строку, начинающуюся с этого символа и идущую к концу исходной строки, если вам повезет — где-то может быть какая-то реализация std::string, которая не обнуляется автоматически. завершить внутренний буфер.

Итак, вместо этого:

std::string(&commandLine_.at(position_))

Использовать:

std::string(1, commandLine_.at(position_))
person Mark Ransom    schedule 08.04.2013
comment
Спасибо. Также работает преобразование delimiters_ в массив char и превращение lexeme_ в std::vector<char>. - person Mushy; 09.04.2013

Это выражение:

 std::string(&commandLine_.at(position_))

Создает объект std::string путем передачи указателя на объект char. Однако указатель на объект char является C-строкой (заканчивающейся нулем), а не указателем на одиночный символ.

Нет конструктора std::string, который принимает один символ. Вы можете сделать свой вектор вектором chars, а затем искать commandLine_.at(position_) внутри этого вектора.

Однако, судя по вашему тестовому примеру, мне кажется, что все, что вам нужно, это find_first_of()< /a> функция-член std::string:

#include <algorithm>
#include <iostream>

int main()
{
    std::string commandLine = "Check me";
    std::string delimiters = " ,();=.*-";
    auto pos = commandLine.find_first_of(delimiters);
    std::cout << pos;
}

Вот живой пример.

person Andy Prowl    schedule 08.04.2013
comment
Кстати, он входит в цикл while, если не нашел; не когда нашел. (что бы он ни искал) - person ; 09.04.2013
comment
@stardust_: Верно, это результат неправильного копирования и вставки. Я все равно отредактировал, спасибо - person Andy Prowl; 09.04.2013