如何对一个元素比较多的vector进行初始化?比如通过"="和""方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何对一个元素比较多的vector进行初始化?比如通过"="和""方式相关的知识,希望对你有一定的参考价值。

结构体定义:
struct scheme_element

std::string name;
std::string sub_element_name;
std::string val;
scheme_element(std::string Name, std::string Sub_element_name, std::string Val)

name = Name;
sub_element_name = Sub_element_name;
val = Val;

;

想要使用如下方法定义一个名为scheme_elements 的vector并初始化,但是会报错:
std::vector<scheme_element> scheme_elements;
std::vector<scheme_element> scheme_elements =

/*在这里错误提示:不允许使用""对std::vector<scheme_element,std::allocator<scheme_element>>"类型的对象进行初始化*/
"a:dk1", "a:sysClr", "windowText",
"a:lt1", "a:sysClr", "window",
"a:dk2", "a:srgbClr", "1F497D",
"a:lt2", "a:srgbClr", "EEECE1",
"a:accent1", "a:srgbClr", "4F81BD",
"a:accent2", "a:srgbClr", "C0504D",
"a:accent3", "a:srgbClr", "9BBB59",
"a:accent4", "a:srgbClr", "8064A2",
"a:accent5", "a:srgbClr", "4BACC6",
"a:accent6", "a:srgbClr", "F79646",
"a:hlink", "a:srgbClr", "0000FF",
"a:folHlink", "a:srgbClr", "800080"
;
我是在VS2012环境下开发的c++程序,请问是不是上边语法是C++11标准的,所以平台不支持?
如果按照常用的初始化方法应该怎么方便的初始化上边的vector?谢谢

这样也报错:

目前只有这样不报错:

你用容器,没有其它的办法!

你可以改用数组啊:

#include <iostream>
#include <vector>
using namespace std ;

struct a 
int x;
char s[10];
 ;
int main()

struct a aa[]=
1,"aaaaa",2,"bbbbb"
; //用数组完成初始化
vector <struct a> bb ;
for( int i=0;i<2;i++ ) //非要存入容器,可以这样!!
bb.push_back( aa[i] );
return 0;

追问

没怎么用过容器。。这个方法好~

追答

不客气

参考技术A 用2013可以追问

2012里只能用push_back一个个去添加么?

追答

貌似是,毕竟是新东西,原来的一定不支持的。

追问

嗯,谢谢啦~

vector容器经常用法

容器简单介绍

定义及初始化

vector<int> vec(5,100);
vector<string> strVec(10,"hello");

末尾插入元素

  vec.push_back(102);
  strVec.push_back("what");

遍历 size() 函数是能够动态添加的

    for(vector<int>::size_type ix=0;ix<vec.size(); ix++)
    { 
        cout<<vec[ix]<<endl;
        vec.push_back(ix+10);
        cout<<"size is"<<vec.size()<<endl;
        if(vec.size()==10)
        {
          break;
        }
    }
    for(vector<string>::size_type jx=0;jx<strVec.size();jx++)
    {
         cout<<strVec[jx]<<endl;
    }

通过下标操作添加改变vector内容,不是安全的操作

vector <int> vec2(10);
    cout<<vec2[9]<<endl;
    cout<<vec2[10]<<endl;

仅能对已存在元素进行下标操作。不存在会crash

vector<int> emptyVec;
//cout<<emptyVec[0]<<endl;    error

将元素一个容器复制给另外一个容器,类型必须匹配。容器类型和元素类型必须同样

    vector<int> vecCopy(vec);
    for(vector<int>::size_type i=0;i<vecCopy.size();i++)
    {
      cout<<vecCopy[i]<<endl;
    }

迭代器简单介绍

全部标准库容器都支持迭代器。但仅仅有少数的容器支持下标操作

定义

    vector<int>::iterator iter;

begin和end操作

begin返回迭代器指向的第一个位置,end指向vector的末端元素的下一个

vector<string>::iterator iBegin=strVec.begin();vector<string>::iterator iEnd=strVec.end();

迭代器的自增和解引用操作

++iter指向第二个元素
*iter指向当前元素

    cout<<*iBegin<<endl;
    cout<<*(iEnd-1)<<endl;
     for(;iBegin<iEnd;iBegin++)
    {
      cout<<*iBegin<<endl;
    }

迭代器的算术操作

iter+n iter-n
iter1-iter2

    string str("richard");
    *(iBegin+3)=str;
    cout<<*(iBegin+3)<<endl;
        cout<<iEnd-iBegin<<endl;
        vector<string>::iterator     
         mid=iBegin+strVec.size()/2;
    cout<<*mid<<endl ;

const_iterator 仅仅读

高级使用方法

容器元素类型必须满足例如以下两个约束

元素类型必须支持赋值运算
元素类型的对象必须能够复制
除了引用类型和IO标准库类型外。全部内置内置类型和复合类型都支持容器

顺序容器的操作

begin() 返回一个迭代器,指向容器的第一个元素
end()指向最后一个元素 。rbegin()逆序迭代器,指向容器的最后一个元素,rend()指向容器第一个元素前面位置

加入元素的操作

list,vector和dequeue支持例如以下操作
c.push_back(t); 在容器c末尾加入元素
list和dequeue 支持push_fron(t); 在容器c的最前面加入元素

 list<int> ilist;
    for(size_t ix=0;ix<4;ix++){
        ilist.push_front(ix);
    }
    for(list<int>::iterator iter=ilist.begin();iter!=ilist.end();iter++){
        cout<<*iter<<endl;
    }

insert操作实现一组更通用的方法,实如今容器内随意制定的位置插入新的元素

vector<string> strVec;
    //第一种情况 。參数是位置和内容
   strVec.insert(strVec.begin(),"yang");

   //另外一种情况,參数是数量和内容
   strVec.insert(strVec.begin(),1,"richard");
   for(int i=0;i<strVec.size();i++){
    // cout<<strVec[i]<<endl;
   }
   //第三种情况,參数是指针
   string sarray[4]={"hello","world","hello","fat"};
   strVec.insert(strVec.begin(),sarray+1,sarray+3);
    for(i=0;i<strVec.size();i++){
     cout<<strVec[i]<<endl;
   }

避免存储end操作返回的迭代器

当向vector加入元素时,end失效,内存地址发生了改变,此时千万不用使用存储end操作的迭代器

关系运算符

比較的容器必须具有同样的容器类型,并且元素类型也必须同样

容器大小的操作

size()返回容器的长度
empty()标记容器大小是否为零
resize(n)调整容器大小,使其容纳n个元素。

font和back操作

font()返回容器的第一个元素
back()返回容器的最后一个元素

 vector<int> vec(5,10);
    cout<<vec.front()<<endl;
    vec.push_back(11);
    cout<<vec.back()<<endl;

删除元素

1、pop_back()删除容器的最后一个元素。返回void
2、erase(p)删除迭代器p所指向的元素
3、erase(b,e)删除迭代器b和e所标记范围内全部的元素,返回一个迭代器,指向被删除元素段后面的元素。假设e本身就是指向末端的下一个位置的迭代器。则返回的迭代器也指向同样的位置
4、clear() 删除容器内的全部元素

 vector<int> vec(5,10);
    cout<<vec.front()<<endl;
    vec.push_back(11);
    cout<<vec.back()<<endl;
    vec.pop_back();
    cout<<vec.size()<<endl;
    vec.erase(vec.begin());
    cout<<vec.size()<<endl;
    vec.erase(vec.begin(),vec.end());
    cout<<vec.size()<<endl;
    vec.clear();
    cout<<vec.size()<<endl;

capacity和reserve

capacity操作获取容器须要分配很多其它空间之前能够存储的元素总数,reserve操作则告诉vector应该预留多少个元素的存储空间

vector<int> vec(5,10);
    for(int i=0; i<10; i++) {
       vec.push_back(i);
    }
    cout<<vec.capacity()<<endl;
    vector<int> vec2;
    vec2.reserve(30);
    cout<<vec2.capacity()<<endl;

以上是关于如何对一个元素比较多的vector进行初始化?比如通过"="和""方式的主要内容,如果未能解决你的问题,请参考以下文章

Vector与List在对序列元素进行增删操作时性能的比较

vector动态数组 如何初始化

如何利用C++/STL vector的sort算法对元素是自定义类型进行排序

C++中,vector参数为类型时,如何查找和添加元素?

访问vector元素方法的效率比较(转)

vector 中如何修改某一个元素的值?