2015-06-25 2 views
1

У меня нет ошибок, но мой результат не тот, что я хотел. Я хочу, чтобы «stuff + i» вводился в вектор. НО мой вывод - это только моя первоначальная переменная «stuff» - 1 символ.Моя векторная структура не итерируется, как ожидалось

stuff 
tuff 
uff 
ff 
f 
/0 
/0 
gello? 
ello? 
llo? 
gello? 

Код:

#include <iostream> 
#include <string> 
#include <vector> 

struct Playlist 
{ 
    std::string name; 
} ; 

int main() 
{ 
    std::vector<Playlist> playlist; 

    std::cout << "Input 10 stuff" << std::endl; 

    for(int i = 0; i < 10; ++i) 
    { 
     Playlist ok; 
     ok.name = "stuff " + i; 
     playlist.push_back(ok); 
     std::cout << playlist.size() << std::endl; 
    } 

    std::vector<Playlist>::iterator iter = playlist.begin(); 

    while(iter != playlist.end()) 
    { 
     std::cout << iter->name << std::endl; 
     ++iter; 
    } 

    std::cout << "gello?" << std::endl; 
std::vector::iterator iter = playlist.begin(); 

while(iter != playlist.end()) { std::cout << iter->name << std::endl; ++iter; } 

std::cout << "gello?" << std::endl; 


    return 0; 
} 

ответ

4

Изменить это утверждение

ok.name = "stuff " + i; 

в

ok.name = "stuff " + std::to_string(i); 

Что касается заявления

ok.name = "stuff " + i; 

затем в правой части используется указатель арифметики. Строковый литерал преобразуется в указатель на его первый элемент. Таким образом,

"stuff " + 0 returns pointer to character 's' 
"stuff " + 1 returns pointer to character 't' 
"stuff " + 1 returns pointer to character 'u' 

и так далее.

Итак, первый push_back имеет дело с строкой «stuff». Второй - со строкой «туф», третий - со строкой «uff» и т. Д.

В результате программа имеет неопределенное поведение, поскольку sizeof ("stuff") меньше 10, и вы пытаетесь получить доступ к памяти за строковым литералом.

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