Re: segmentation fault...
Fei Liu wrote:
What's wrong with the following code? It seems I can't assign to a
vector<string> element...
You have no elements to assign to. I believe you don't understand what
reserve() actually does, it does not create any elements, it only reserves
space for them. Try using a.at(i) instead of a[i].
What you really want is the resize() member function of vector.
#include <vector>
#include <iostream>
#include <iterator>
#include <functional>
#include <string>
#include <algorithm>
using namespace std;
struct c{
vector<string> a;
void set_size(int n) { a.reserve(n); }
void set_val(int i, string v) { a[i] = v; }
};
void foo(c & cc){
cc.set_size(10);
cc.set_val(3, "value 3");
}
int main(){
vector<int> a;
a.reserve(10);
a.size() == 0
a[3] = 10;
Undefined behaviour. Use
a.at(3) = 10;
copy(a.begin(), a.end(), ostream_iterator<int>(cout, " "));
OK. a.begin() == a.end()
cout << "a[3]: " << a[3] << endl;
UB.
{
vector<string> a;
a.reserve(10);
a.size() == 0
a[3] = "value 3";
Undefined behaviour. While the previous errors are also undefined behaviour,
i guess this is what actually _caused_ the crash? A likely reason is that
a[3] returns some raw memory, on which no string has been constructed.
copy(a.begin(), a.end(), ostream_iterator<string>(cout, " "));
again, a.begin() == a.end(), so this is a no-op.
cout << "a[3]: " << a[3] << endl;
But this is UB again.
}
c cc;
foo(cc);
And UB.
}
--
rbh