vector
vector能向数组下标那样使用吗,
答: 可以
比如我用定义vector<int>s;能用s[i]进行运算或者s[i]==s[i+1]吗?
答: 可以
从函数中返回vector最高效的是采用引用参数的方式
比如你定义一个函数:
void fun(vector<int>& vi) // 参数定义为引用
{
在这里给vi赋值
}
void main()
{
vector<int> s;
fun(s);// 调用函数返回数据到s
}
因为迭代器与容器是分离的,可以通过迭代器来操控容器里面的元素,但不能通过迭代器来操控容器。所以当容器内部发生变化,
容器并不通知迭代器发生了什么变化(他们是分离的),所以当发生变化后,迭代器就失效了。
而容器何时会发生变化,完全是掌握在程序员手里的,也就是说,例如对容器进行某个操作,将可能导致容器内部的变化,
那么为了保证这个操作之后迭代器仍然有效,那么必须手动重新设置该迭代器。
vector<string> &readText( ) /*返回一个对象的引用,这个对象的类型是vector<string>。即对应后面的return text。*,也就是返回这个对象本身,而非副本。/
{
vector<string> text;
string word;
while ( cin >> word ) /*不断读取输入的单词,直到读入结束或者读取失败。cin >> word返回cin本身,当它作为测试条件的时候,测试它的状态。当输入结束或者读取失败的时候,状态为逻辑值fasle,条件测试结果为false。*/
{
text.push_back( word );
// ...
}
// ....
return text;/*返回了一个局部变量,这个局部变量在函数return语句后就立即失效,其占用的内存被回收,这个内存可能没有被分配新用,也可能已经被重要的新对象占用,如果已经被分配做它用,返回这个对象的引用可能是个非常重要的对象,如果对这个对象操作,可能引起严重系统崩溃。*/
}
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <iostream>
using namespace std;
typedef vector<string> vector_str;
vector_str * split_str(const char *str, const char *splitter)
{
vector_str * p_vector = new vector_str;
char * token;
char * buff = new char[strlen(str) + 1];
strcpy(buff, str);
token = strtok(buff, splitter);
while (token != NULL) {
p_vector->push_back(token);
token = strtok(NULL, splitter);
}
delete[] buff;
return p_vector;
}
int main(int argc, char *argv[])
{
vector_str * v1 = split_str("aa:bb:cc:dd", ":");
vector_str::iterator Iter;
for (Iter = v1->begin(); Iter != v1->end(); Iter++) {
cout << *Iter << ' ';
}
delete v1;
system("PAUSE");
return 0;
}
呵呵,我用VS2010恰好也碰上类似问题
如果有两个类:ADlg和BDlg,他们的文件和头文件分别是ADlg.cpp,ADlg.h,BDlg.cpp,BDlg.h
我的做法是在ADlg.cpp 文件中包含BDlg.h ,在ADlg.h中定义了BDlg m_TreeManager;
在ADlg.cpp的initDialog()函数中m_TreeManager.create(.....)关联了两个类,
结果编译出现了楼主的相似问题
解决方法:
在ADlg.h头文件中也包含BDlg.h(#inlcude "BDlg.h")
呵,编译成功!