Jason Lee
Jason Lee

Reputation: 83

c++ iterate through a vector of strings

So I recently discovered the use of map and vectors, however, I'm having trouble of trying to figure a way to loop through a vector containing strings.

Here's what I've tried:

#include <string>
#include <vector>
#include <stdio>

using namespace std;

void main() {
    vector<string> data={"Hello World!","Goodbye World!"};

    for (vector<string>::iterator t=data.begin(); t!=data.end(); ++t) {
        cout<<*t<<endl;
    }
}

and when I try to compile it, I get this error:

cd C:\Users\Jason\Desktop\EXB\Win32
wmake -f C:\Users\Jason\Desktop\EXB\Win32\exbint.mk -h -e
wpp386 ..\Source\exbint.cpp -i="C:\WATCOM/h;C:\WATCOM/h/nt" -w4 -e25 -zq -od    -d2 -6r -bt=nt -fo=.obj -mf -xs -xr
..\Source\exbint.cpp(59): Error! E157: col(21) left expression must be integral
..\Source\exbint.cpp(59): Note! N717: col(21) left operand type is 'std::ostream watcall (lvalue)'
..\Source\exbint.cpp(59): Note! N718: col(21) right operand type is 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> (lvalue)'
Error(E42): Last command making (C:\Users\Jason\Desktop\EXB\Win32\exbint.obj) returned a bad status
Error(E02): Make execution terminated
Execution complete

I tried the same method using map and it worked. The only difference was I changed the cout line to:

cout<<t->first<<" => "<<t->last<<endl;

Upvotes: 8

Views: 49514

Answers (5)

Scott Deagan
Scott Deagan

Reputation: 413

#include <iostream>
#include <vector>
#include <string>
 
int main()
{
   std::vector<std::string> data = {"Hello World!", "Goodbye World!"};

   for (std::vector<std::string>::iterator t = data.begin(); t != data.end(); t++) {
    std::cout << *t << std::endl;
   }

   return 0;
}

Or with C++11 (or higher):

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

typedef std::vector<std::string> STRVEC;

int main()
{
    STRVEC data = {"Hello World!", "Goodbye World!"};

    for (auto &s: data) {
        std::cout << s << std::endl;
    }

    return 0;
}

Upvotes: 3

BlackJack
BlackJack

Reputation: 4679

From the Open Watcom V2 Fork-Wiki on the C++ Library Status page:

<string>

Mostly complete. Although there are no I/O operators, all other member functions and string operations are available.

A workaround (besides implementing the << operator) would be asking the string instances for the C string:

for (vector<string>::iterator t = data.begin(); t != data.end(); ++t) {
    cout << t->c_str() << endl;
}

This of course only works as long as the strings don't contain zero byte values.

Upvotes: 1

Ishpreet
Ishpreet

Reputation: 5880

Add iostream header file and change stdio to cstdio.

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

using namespace std;

int main() 
{
    vector<string> data={"Hello World!","Goodbye World!"};
    for (vector<string>::iterator t=data.begin(); t!=data.end(); ++t) 
    {
        cout<<*t<<endl;
    }
    return 0;
}

Upvotes: 12

Jason Lee
Jason Lee

Reputation: 83

I found a solution to my own issue. Instead of using a c_str, I used std::string and switched to using the G++ compiler instead of Open Watcom

Instead of having:

char *someString="Blah blah blah";

I instead replaced it with:

string someString="Blah blah blah";

This way is much more efficient and easier.

Upvotes: -2

Toby Speight
Toby Speight

Reputation: 30762

When I compile your code, I get:

40234801.cpp:3:17: fatal error: stdio: No such file or directory
 #include <stdio>
                 ^

You clearly have a header called "stdio" in your include path that you haven't shown us.

If you change that line to the standard #include <iostream>, then the only reported error is that you wrote void main() instead of int main(). Fix that, and it will build and run.

In passing, note also that using namespace should be avoided.

Upvotes: 0

Related Questions