2013-04-08 3 views
0

std :: find не оценивается, как я ожидал.std :: find не работает как ожидалось

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

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 в lexeme_ к char в CommandLine, аналогичной это выражение Java

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

Оценка должна оцениваться char s, и если она определяет char в , то выполняется сравнение, затем цикл while будет завершен.

TestCase

#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; 
} 
+1

Можете ли вы построить полный тест-случай, чтобы продемонстрировать это? –

+0

@DrewDormann нуждается в цитате. Как сказано, это смехотворно. Это, конечно, не «конечно» быстрее. – sehe

+0

Так в чем проблема? Что делает этот код, и что вы ожидали от него, и как он делает, отличается от того, что вы ожидаете от него? Короче говоря, http://whathaveyoutried.com/ – jalf

ответ

3

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

Таким образом, вместо этого:

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

Использование:

std::string(1, commandLine_.at(position_)) 
+0

Спасибо. Также выполняется преобразование 'delimiters_' в массив' char' и создание 'lexeme_'' 'std :: vector ''. – Mushy

2

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

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

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

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

Однако, судя по тестовой случае, мне кажется, все, что вы хотите, это функция find_first_of() член 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; 
} 

Вот live example.

+0

BTW он входит в цикл while, если не нашел; а не когда он нашел. (независимо от того, что он ищет) – 2013-04-08 21:42:12

+0

@stardust_: Правильно, это было результатом неправильной копии. Я все же отредактировал, спасибо –

Смежные вопросы