std::vector<Foo> vec;
Foo foo(...);
assert(vec.size() == 0);
vec.reserve(100); // I've reserved 100 elems
vec[50] = foo; // but I haven't initialized any of them
// so am I assigning into uninitialized memory?
Run Code Online (Sandbox Code Playgroud)
以上代码是否安全?
假设我有一个空终止字符串向量,其中一些可能是空指针。我不知道这是否合法。这是一个学习练习。
示例代码
std::vector<char*> c_strings1;
char* p1 = "Stack Over Flow";
c_strings1.push_back(p1);
p1 = NULL; // I am puzzled you can do this and what exactly is stored at this memory location
c_strings1.push_back(p1);
p1 = "Answer";
c_strings1.push_back(p1);
for(std::vector<char*>::size_type i = 0; i < c_strings1.size(); ++i)
{
if( c_strings1[i] != 0 )
{
cout << c_strings1[i] << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使我在位置c_strings1[1]
Question处有一个 NULL,向量的大小也是 3 。std::vector<char>
当您推送空值时,如何使用向量中到底存储了什么来
重写此代码?
编辑
我的问题的第一部分已得到彻底解答,但第二部分尚未得到解答。至少我不满意。我确实想看看vector<char>;的用法 不是一些嵌套变体或std::vector<std::string>那些熟悉的变体。所以这是我尝试过的(提示:它不起作用)
std::vector<char> c_strings2;
string …Run Code Online (Sandbox Code Playgroud) 我总是使用resize(),因为我不能使用reserve,因为它给出了错误:向量下标超出范围.当我读到有关resize()和reserve()的差异的信息时,我看到像reserve()这样的东西设置了最大值.可以分配元素的数量,但resize()是我们现在拥有的.在我的代码中我知道max.元素的数量,但reserve()并没有给我任何有用的东西.那么,我怎样才能使用reserve()?
我创建了一个带有一些静态数据的类.像这样的东西:
class Object
{
public:
Object();
Object( Point center, double area );
Object( int cx, int cy, double area );
~Object();
//and other public stuffs here...
private:
Point center;
double area;
static double totalArea;
static int objCounter;
static double areaMean;
};
Run Code Online (Sandbox Code Playgroud)
而不是在我的构造函数和析构函数中:
Object::Object()
{
this->setCenter( Point() );
this->setArea( 0.0 );
objCounter++;
totalArea += 0;
areaMean = totalArea / objCounter;
}
/*this is just the default constructor I
have two others that increment real area, not 0*/
Object::~Object()
{
//cout << …Run Code Online (Sandbox Code Playgroud) 我对realloc的理解是,如果内存连续超出分配点,它可以尝试扩展当前分配而不复制.
在阅读此https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md时,我发现大多数分配器都避免了就地重新分配
.许多内存分配器不支持就地重新分配,尽管大多数内存分配器都可以.这来自现在臭名昭着的realloc()设计,它不透明地执行就地重新分配或分配memcpy-deallocate循环.这种缺乏控制随后迫使所有基于clib的分配器设计避免就地重新分配,包括C++的new和std:allocator.
正如在另一个问题(为什么C++分配器中没有重新分配功能?)中所回答的那样,C++中缺少重新分配器,其中接受的答案提到这样的分配器会禁止重新分配使用C库但不回答为什么不尝试制作realloc如果可能扩展当前内存?
我在使用新的C++ 11 using关键字时遇到问题.据我所知,它是别名typedef.但我无法编译.我想为a的迭代器定义一个别名std::vector.如果我使用它,一切都很完美.
typedef std::vector<fix_point>::iterator inputIterator;
Run Code Online (Sandbox Code Playgroud)
但如果我尝试:
using std::vector<fix_point>::iterator = inputIterator;
Run Code Online (Sandbox Code Playgroud)
代码不能编译:
Error: 'std::vector<fix_point>' is not a namespace
using std::vector<fix_point>::iterator = inputIterator;
^
Run Code Online (Sandbox Code Playgroud)
为什么不编译?
我有以下代码的问题:
const std::vector < std::string > arr1 = { "a", "b", "c" };
const std::vector < std::string > arr2 = { "e", "f", "g" };
const std::vector < std::string > globaArr = { arr1, arr2 }; // error
Run Code Online (Sandbox Code Playgroud)
我需要用值来初始化globalArr:"a","b","c","e","f","g"(在一个维度上).我不需要二维数组.我做错了什么?
我可以这样做:
globalArr.push_back( arr1 ); // with the for loop inserting each value of arr1
globalArr.push_back( arr2 );
Run Code Online (Sandbox Code Playgroud)
但是这里的globalArr不再是const :)我需要所有三个向量的相同类型.
我正在寻找预定义函数将整数向量转换为正常整数,但我找不到.
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
Run Code Online (Sandbox Code Playgroud)
需要这个:
int i=123 //directly converted from vector to int
Run Code Online (Sandbox Code Playgroud)
有可能实现这个目标吗?
我有一个名为Sheep的结构数组(A [#])(因为我的任务是关于绵羊DNR).在我做任何要求的任务后,我留下了这个结构:
struct Sheep
{
string Vardas;
char Fragmentas[CMax];
int atitikme = 0;
};
Run Code Online (Sandbox Code Playgroud)
在我的内部,数据是:
(string Vardas) | (char Fragmentas[CMax]) | (int atitikme)
Baltukas TAGCTT 3
Bailioji ATGCAA 3
Smarkuolis AATGAA 1
Run Code Online (Sandbox Code Playgroud)
(char Fragmentas [CMax]将不会使用,所以你不必看它,我只是将它命名为明确).
所有这些数据都来自U2.txt文件,无法在代码中手动输入.
它剩下要做的就是按照这些规则对它进行排序:
- 它通过'int atitikme'从大到小.
- 如果'int atitikme'相等,那么它必须按'A [#]排序.Vardas按字母顺序排列.
要通过'int atitikme'对其进行排序,我创建了一个代码:
string q;
char w[20];
int e;
for (int o = 0; o < n-1; o++)
{
for (int p = o+1; p < n-1; p++)
{
if (A[p].atitikme > A[o].atitikme)
{
// - Vardo Keitimas
q …Run Code Online (Sandbox Code Playgroud) Standard指定STL容器在开始移动后(在本例中,我们说的std::move是启用移动构造/赋值)处于有效但未指定的状态。
我相信这意味着我们只能应用不需要任何先决条件的操作。我记得这里有人在Stackoverflow上声称是真实的,经过一番检查我同意了。不幸的是,我不记得我检查了哪些资源。此外,我无法在标准中找到相关信息。
从[container.requirements.general/4]表62([tab:container.req])中,我们可以看到a.size()没有任何先决条件。这是否意味着此代码是安全的?
#include <iostream>
#include <vector>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = std::move(v1);
std::cout << v1.size(); // displaying size of the moved-from vector
}
Run Code Online (Sandbox Code Playgroud)
这是未指定什么将这个代码打印,但它是安全的?意思是,我们这里有未定义的行为吗?
编辑:如果我问其他容器,我相信这个问题不会太广泛。答案在包括STL在内的所有其他STL容器中是否一致std::string?